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 :

utilisation des Patch


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut utilisation des Patch
    Salut tous,

    récemment DUT m'a fait découvrir les Patch, voici ce qu'il m'a donné comme code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    vertices = [0 0 0
                1 0 0
                1 1 0
                0 1 0];
     
    faces = [1 2 3 4];
    figure
    patch('vertices',vertices,'faces',faces,'facecolor','none','edgecolor','r')
    axis equal
    à présent je voudrais tracer plusieurs cubes (donc 3D) liés entre eux à l'aide de la commande Patch, mais même avec ce tuto:

    http://www.mathworks.com/help/techdo.../f2-11758.html

    je n'y arrive pas...

    1°) j'ai toutes les coordonnées de mes noeuds, j'ai la table de connectivité mais je ne sais pas comment faire

    2°) pourriez vous me donner un exemple à partir du schéma que j'ai mis en pièce jointe ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Avec les matrices x, y, z que tu peux voir dans la doc de ton lien:
    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
    22
    23
    24
    25
    26
    27
    x =[0 1 1 0 0 0
        1 1 0 0 1 1 
        1 1 0 0 1 1 
        0 1 1 0 0 0 ];
    y = [0 0 1 1 0 0 
        0 1 1 0 0 0 
        0 1 1 0 1 1 
        0 0 1 1 1 1 ];
    z = [0 0 0 0 0 1 
        0 0 0 0 0 1 
        1 1 1 1 0 1 
        1 1 1 1 0 1 ];
     
    cote1 = [2 2 2];
    origin1 = [0 0 0];
    cote2 = [2 2 2];
    origin2 = [2 0 0];
    x1 = cote1(1)*x+origin1(1);
    y1 = cote1(2)*y+origin1(2);
    z1 = cote1(3)*z+origin1(3);
    x2 = cote2(1)*x+origin2(1);
    y2 = cote2(2)*y+origin2(2);
    z2 = cote2(3)*z+origin2(3);
     
    patch(x1,y1,z1,'r'),hold on
    patch(x2,y2,z2,'g')
    view(3)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    super! merci jerome!

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    1°) j'ai toutes les coordonnées de mes noeuds, j'ai la table de connectivité mais je ne sais pas comment faire
    Ce n'est quand même pas si difficile que ça...

    Vertices contient les coordonnées des noeuds, chaque ligne correspond à un triplet (X,Y,Z). Dans ton cas, Vertices est de taille Mnx3 avec Mn = nombre de noeuds

    Faces contient la table de connectivité, chaque ligne donne la connectivité d'une face. Dans ton cas, Faces est de dimension Mfx4 avec Mf = nombre de faces

    Qu'est-ce que tu ne comprends toujours pas ?

    Cette méthode est beaucoup plus économique que celle décrite par Winjerome (pour un résultat quasiment identique)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci DUT D'avoir pris le temps de répondre
    j'ai compris à présent pour effectuer 1cube

    Si je veux tracer deux cubes il y a donc deux solutions?
    => donner tous les noeuds et la table de connectivité associée
    => donner une table de connectivité pour cube et faire une boucle avec différentes coordonnées de noeuds

    (moi j'etais parti sur la 2eme solution, masi la 1ere à l'air mieux?)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    j'ai testé DUT et je suis en galère.

    ==> j'arrive à tracer un carré mais pas les deux superposés...

    voici ce que j'ai fait pour tracer deux carré séparés
    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
    22
    23
    vertices=[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1;0 0 2;1 0 2;0 1 2;1 1 2];
    connectivity1=[1 2 4 3 5 6 8 7];
    connectivity2=[5 6 8 7 9 10 12 11];
    connectivity=[connectivity1 connectivity2];
    vertices=vertices(connectivity,:);
    faces1=[1 2 3 4;
           1 2 6 5;
           2 3 7 6;
           3 4 8 7;
           4 1 5 8;
           5 6 7 8];
       faces2=[1 2 3 4;
           1 2 6 5;
           2 3 7 6;
           3 4 8 7;
           4 1 5 8;
           5 6 7 8];
    faces=[faces1 faces2];
    for i=1:2
        figure
    patch('vertices',vertices,'faces',faces1,'facecolor','none','edgecolor','r')
    patch('vertices',vertices,'faces',faces2,'facecolor','none','edgecolor','r')
    end
    1°)cela me trace bien un carré sur deux graphiques séparés mais je voudrais les tracer sur le même graphique

    2°)sur le 2eme graphique les coordonnées sont les memes que pour le premier, pourquoi les coordonnées ne sont pas prisent en compte?

    j'utilise le vecteur connectivity pour classer de la meme façon les données des faces supérieurs et inférieurs et normalement je pourrais utiliser la même matrice "face" pour générer mes carrés

    j'espere que vous pourrez m'aider...


    ps: voici le code que j'ai fais pour avoir un cube seul. (il n'est pas utile ici c'est just epour que vous compreniez le classement que j'ai fais ci dessus dans le cas où il y a deux cubes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vertices=[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1];
    %table connectivité des faces superieur et inférieur 
    connectivity=[1 2 4 3 5 6 8 7];
    vertices=vertices(connectivity,:);
    faces=[1 2 3 4;
           1 2 6 5;
           2 3 7 6;
           3 4 8 7;
           4 1 5 8;
           5 6 7 8];
    figure
    patch('vertices',vertices,'faces',faces,'facecolor','none','edgecolor','r')
    axis equal

  7. #7
    Invité
    Invité(e)
    Par défaut
    Donc comme nous le suggère Dut la méthode avec les noeuds et leur connectivité:
    Dans un premier temps, tu possèdes tous les noeuds de ton cube, autrement dit les coordonnées x, y, z des sommets: (Cf pièce jointe, ici un cube d'origine (0,0,0) et de côté 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vertices=[0 0 0   % 1
              1 0 0   % 2
              1 1 0   % 3
              0 1 0   % 4
              0 0 1   % 5
              1 0 1   % 6
              1 1 1   % 7
              0 1 1]; % 8
    Puis dans un second temps, tu fais la connexion de ces différents noeuds avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    faces=[1 2 3 4;
           1 2 6 5;
           2 3 7 6;
           3 4 8 7;
           4 1 5 8;
           5 6 7 8];
    Les chiffres de 1 à 8 représentants les noeuds (ou sommets, représentant les commentaires dans vertices)
    Donc
    1ère ligne 1,2,3,4 (toujours Cf pièce jointe) représente la face du dessous
    2ème ligne 1 2 6 5 représente la face de devant
    3ème ligne 2 3 7 6 représente la face de droite
    ...
    Et ainsi de suite de façon à faire toutes les faces.
    Images attachées Images attachées  
    Dernière modification par Invité ; 26/05/2011 à 00h02.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci WinJerome pour toutes ces explications mais j'avais bien saisi, d'ailleurs le code que j'ai mis plus haut fonctionne, c'est juste que j'ai fais un classement de noeuds un peu complexe (car je fais le meme classement à un autre endroit et ca m'arrange de le reutiliser ici) mais je n'arrive pas à tracer deux carré à coté (ou au dessus)

    J'ai fais ce classement un peu bizarre car en fait au final je voudrais non pas tracer deux cubes mais tracer "L" cube dans la longueur "l" dans la largeur et "H" dans la hauteur (un gros cube qui contient plein de petit). Or je connais deja toutes les coordonnées et j'ai les "connectivité des faces supérieurs et inférieur" de tous les cubes (vecteur connectivité)

    donc si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    noeuds=noeuds(connectivité , : )
    le vecteur resultant aura la même "gueule" pour tous mes elements (il suffit de le verifier sur le papier pour un cas simple car c'est pas evidant a voir) et ainsi je peux utiliser la meme matrice "face" pour tracer les surfaces.

    Le probleme je ne le vois pas d'erreur dans mon code car j'ai vérifier sur le papier ce cas "simple" et sur le papier ça fonctionne en respectant les regles que tu m'as rappelé ci dessus...

    edit:
    - peut etre que ce n'est qu'une option de tracé/graphique...

    - si tu regarde le contenu de vertices dans mon code (le 1er) tu va voir que tu trouve les coordonnées de chaques sommet de chaque élément à la suite (et classé de la meme façon)

    => les 4 premieres lignes sont les noeuds de la face inférieur dans le sens trigo de l'element 1, les 4suivant sont les noeuds de la face superieur du meme elemennt.
    => meme chose pour les noeuds de l'element 2 avec les lignes 8 à 16.

    conséquence:
    je pense que je peux donc utiliser la meme matrice "face" pour tous les elements puisque les coordonnés sont placés de la meme façon pour tous les elements...

    edit2:
    peut etre qu'il y a plus simple pour faire ce cube contenant plein de petits cubes mais j'ai fais de cette façon pour avoir une matrice "faces" facile et générer et facilement généralisable. (et comme je connais deja les vecteurs connectivity et vertices ca me permet de faire immediatement le plot sans avoir à faire de nouvelles manipulations de vectices, seul la matrice "face" suffit et dans mon cas c'est une imbrications de plusieurs matrices "face" identiques)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation des titres avec Patch
    Par MBAYE BABACAR GUEYE dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/07/2011, 19h47
  2. Utilisation des patchs
    Par zouzoukha dans le forum WinDev
    Réponses: 2
    Dernier message: 08/01/2010, 21h00
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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