IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Intersection de deux cylindres


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Intersection de deux cylindres
    Bonjour à tous.
    Je cherche à récupérer un ensemble de coordonnées correspondant à l'intersection de deux cylindres (et qui devraient correspondre à un "cercle")
    Pour tracer les deux cylindres, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    %Variables
    r=1;
    theta=(0:pi/30:2*pi);   
    h=(0:1/30:2);               
    [h,theta]=meshgrid(h,theta);
     
    %Premier cylindre
    x_cylinder=r*cos(theta);     
    y_cylinder=r*sin(theta);      
    z_cylinder = h;    
     
    %Deuxième cylindre              
    x_cylinder_2=(r/5)*cos(theta)+1;
    y_cylinder_2=(r/5)*sin(theta);
    z_cylinder_2=h+0.9;
     
    %Affichage
    mesh(x_cylinder,y_cylinder,z_cylinder,'FaceColor',[0.3,0.5,0.3],'EdgeColor','black');
    hold on;
    mesh(z_cylinder_2,y_cylinder_2,x_cylinder_2,'FaceColor','red','EdgeColor','black');
    Etant donné que les deux cylindres sont l'uns dans l'autre, il y a forcément des coordonnées identiques...
    Pour avoir les coordonnées utilisées par la fonction mesh, j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    A=[x_cylinder y_cylinder z_cylinder];
    A=reshape(A,3721,3);
    B=[x_cylinder_2 y_cylinder_2 z_cylinder_2];
    B=reshape(B,3721,3);
    Où 3721 correspond à la taille de h * la taille de theta.
    Je me retrouve donc avec deux matrices A et B de 3 colonnes chacune qui correspondent respectivement aux coordonnées x, y et z de chaque cylindres.(J'ai bien vérifier que les coordonnées obtenus étaient sur le cylindre correspondant en traçant quelques points au hasard)
    Ensuite je compare les colonnes pour trouver les coordonnées identiques de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    a=1;
    x_circle=[]
    for i=1:1:3721
        for j=1:1:3721
            if A(i,1)==B(j,3) 
                x_circle(a)=B(j,3);
                a=a+1;       
            end
        end
    end
    x_circle est censé est un vecteur contenant les coordonées en x.
    Vu que pour tracer le 2eme cylindre j'ai pris z_cylinder_2 en coordonnée en x, je compare bien les coordonnées en x des deux cylindres (ce qui correspond bien à la colonne 1 de la matrice A et à la colonne 3 de la matrice B. Dans tous les cas j'ai fais toutes les possibilités)
    Je n'obtient aucun résultat, il ne retourne que des 1, surement car il y en a quelques un dans les coordonnées, mais rien d'autre.

    Je me demande donc si c'est dans ma démarche qu'il y a un problème...j'ai du manquer un truc tout bête, c'est pourquoi je fais appel à vous

    Merci de votre aide.

  2. #2
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    j'ai lu un peu rapidement et je ne reprendrais pas ton raisonnement.
    concernant ceci
    Citation Envoyé par gilsub
    a=1;
    x_circle=[]
    for i=1:1:3721
    for j=1:1:3721
    if A(i,1)==B(j,3)
    x_circle(a)=B(j,3);
    a=a+1;
    end
    end
    end
    il faut bien voir que tu n'incrémentes 'a' que quand la condition est vérifiée
    Citation Envoyé par gilsub
    Je n'obtient aucun résultat, il ne retourne que des 1, surement car il y en a quelques un dans les coordonnées, mais rien d'autre.
    cela voudrait dire que A(i,1)=B(j,3) seuelment pour des valeurs de 1, les autres n'étant pas en commun ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Hello et merci d'avoir répondu.
    En effet, je n'incrémente que a, ca permet juste de mettre les valeurs trouvées les unes à la suite des autres, dans un vecteur colonne.
    Dans toutes les valeurs, il y a en effet quelques 1 dans chaque, il ne retourne donc que ca, ce qui veut dire qu'il n'y a aucun autre point en commun entre les deux cylindres.
    J'ai essayé d'augmenter le nombre de point, mais sans succès.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par gilsub Voir le message
    Bonjour à tous.
    Je cherche à récupérer un ensemble de coordonnées correspondant à l'intersection de deux cylindres (et qui devraient correspondre à un "cercle")
    Ce n'est pas vraiment un cercle, plutôt un cercle déformé (à cause de la courbure des cylindre).


    Citation Envoyé par gilsub Voir le message
    Etant donné que les deux cylindres sont l'uns dans l'autre, il y a forcément des coordonnées identiques...
    Il y a peux de chance que les noeuds de tes maillages des 2 cylindres soient identiques (même si tu augmente le nombre de points). Peut-être avec vraiment énormément de points et en cherchant les points qui sont suffisamment proche (à un intervalle près), tu aurais une première approximation.

    Par contre je n'ai pas compris pourquoi tu compares A(i,1) avec B(j,3) ?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Salut !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mesh(x_cylinder,y_cylinder,z_cylinder,'FaceColor',[0.3,0.5,0.3],'EdgeColor','black');
    hold on;
    mesh(z_cylinder_2,y_cylinder_2,x_cylinder_2,'FaceColor','red','EdgeColor','black');
    Pour le 1er cylindre j'ai x_cylinder en coordonnée x, d'ou A(i,1)
    Pour le 2eme cylindre j'ai z_cylinder en coordonnée x, d'ou B(i,3)

    J'ai testé selon ton conseil en changeant le test de la façon suivante :
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abs(A(i,1)-B(j,3))<eps
    J'obtiens beaucoup de valeur, mais du coup lorsque je fais ca pour les trois coordonnées (x,y,z) (en comparant A(i,1) et B(j,3), A(i,2)==B(j,2) et A(i,3)==B(j,1), j'obtiens 3 matrices avec un nombre de colonnes totalement différent, ce qui ne devrait pas être le cas, et qui est surement dû à l'approximation...
    Du coup, je suis bloqué. Pas d'idées pour récupérer ces coordonnées? ou du moins en avoir une bonne approximation?
    Merci d'avance.

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par gilsub Voir le message
    J'obtiens beaucoup de valeur, mais du coup lorsque je fais ca pour les trois coordonnées (x,y,z) (en comparant A(i,1) et B(j,3), A(i,2)==B(j,2) et A(i,3)==B(j,1), j'obtiens 3 matrices avec un nombre de colonnes totalement différent, ce qui ne devrait pas être le cas, et qui est surement dû à l'approximation...
    Tu les compares séparément? Utilises plutôt un et logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if abs(A(i,1)-B(j,3))<eps && abs(A(i,2)-B(j,2))<eps && abs(A(i,3)<B(j,1))
          % Les points A(i,:) et B(j,:) sont proches.
    end
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci de ta réponse, j'ai essayé ce que tu as mis, mais sans résultats, il ne trouve que les points à 1.
    Du coup j'ai cherché sur internet et j'ai trouvé les équations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x=r*cos(theta);
    y=r*sin(theta);
    z=sqrt(r^2-r2^2*sin(theta)^2);
    qui correspondent exactement a la courbe d'intersection de deux cylindres, mais qui m'ennuit un peu vu que je ne sais pas d'ou ca vient.

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Tu as réussi à l'appliquer dans ton cas?


    Je crois que cette formule considère 2 cylindres, l'un d'axe z et d'équation :
    x^2+y^2=r1^2
    et l'autre d'axe y et d'équation :
    x^2+z^2=r2^2

    et ce que tu as est la résolution de ce système...
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Oui, j'ai réussi à l'appliquer, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x_cricle=sqrt(r^2-(r/5)^2*sin(theta).^2);
    y_circle=-(r/5)*sin(theta);
    z_circle=(r/5)*cos(theta)+1;
    Merci, cela à l'ai effectivement d'être la résolution du système que tu donnes.
    J'ai testé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [x,y] = solve( 'x^2+y^2=r1^2' , 'y^2+z^2=r2^2' )
    et cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    x =
     
      (r1^2+z^2-r2^2)^(1/2)
     -(r1^2+z^2-r2^2)^(1/2)
      (r1^2+z^2-r2^2)^(1/2)
     -(r1^2+z^2-r2^2)^(1/2)
     
    y =
     
      (-z^2+r2^2)^(1/2)
      (-z^2+r2^2)^(1/2)
     -(-z^2+r2^2)^(1/2)
     -(-z^2+r2^2)^(1/2)
    J'ai essayé de plot ca avec un z qui varie mais ca n'a pas l'air d'être ca. En fait, le système a deux équations et trois inconnus...?
    Il faudrait passer en paramétrique je pense mais je vois pas trop comment faire...mais bon tant pis Merci des conseils en tout cas.

Discussions similaires

  1. surface de l'intersection de deux triangles quelconques
    Par zekey dans le forum Mathématiques
    Réponses: 35
    Dernier message: 07/10/2007, 14h12
  2. Detection de collision entres deux cylindres.
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/11/2006, 15h36
  3. [debutant] intersection de deux plages horaires
    Par absolut75 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 24/05/2006, 14h03
  4. Intersection de deux courbes quelconques
    Par ShootDX dans le forum Algorithmes et structures de données
    Réponses: 32
    Dernier message: 31/03/2006, 11h32
  5. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 19h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo