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

  1. #1
    Membre éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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 302
    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 302
    Points : 53 165
    Points
    53 165
    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)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ce qu'il te faut changer, c'est aussi tes faces: ici ton faces1 et faces2 sont les mêmes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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,:);
       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];
    patch('vertices',vertices,'faces',faces,'facecolor','none','edgecolor','r')
    patch('vertices',vertices,'faces',faces+8,'facecolor','none','edgecolor','r')
    view(3)
    Dernière modification par Invité ; 26/05/2011 à 00h43.

  10. #10
    Membre éclairé
    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
    Points : 877
    Points
    877
    Par défaut
    je n'avais pas compris en effet qu'il fallait faire + 8, c'est bien pour selectionner les 8 prochaines lignes dans notre matrice de noeuds?
    MERCI jerome!!

    voici ce que j'ai donc fais grace à toi
    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
    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=faces1+8;
    faces=[faces1;faces2];
    patch('vertices',vertices,'faces',faces,'facecolor','none','edgecolor','r')
    view(3)
    par contre si on veut faire une cube contenant "L" cubes dans la longueur, "l" dans la largeur et "H" dans la hauteur il faudra non plus faire un plus 8 il va falloir incrementer selon la direction souhaitée, et je ne vois pas comment faire.


    j'ai essayé avec un gros cube contenant 4 cubes sur un étage inférieur et 4 sur l'étage supérieur comme ceci:
    http://imageshack.us/photo/my-images/10/8cubes.jpg/

    mais je ne vois pas comment construire la matrice "face",

  11. #11
    Invité
    Invité(e)
    Par défaut
    Une solution en faisant plutôt varier les vertices. Ce sont les sommets qui changent et non la façon dont tu les lies.
    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
    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];
    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];
    for i = 1:4
        for j = 1:4
            for k = 1:4
                origin= [i j k];
                V = bsxfun(@plus,vertices,origin);
                patch('vertices',V,'faces',faces,'facecolor','none','edgecolor','r')
            end
        end
    end
    view(3)

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Dans le cas de maillages avec beaucoup d'éléments à afficher, si vous voulez éviter que les performances graphiques de MATLAB ne s'effondrent (), je vous conseille de ne faire appel qu'une seule fois à la fonction PATCH. Comme ça, MATLAB n'a à gérer qu'un seul objet Patch.

    Il faut donc obtenir les matrices Vertices et Faces complètes avant d'utiliser PATCH.

    La technique ultime consiste à n'afficher que les faces libres du maillage, puisque ce sont les seules visibles depuis l'extérieur (sauf si on utilise une transparence bien entendu). Il faut donc générer une matrice Faces réduite.

    Et comment fait-on ? Il suffit de chercher les lignes de la matrice Faces qui n'apparaissent qu'une seule fois (avec UNIQUE et HISTC)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Membre éclairé
    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
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Dut Voir le message
    Dans le cas de maillages avec beaucoup d'éléments à afficher, si vous voulez éviter que les performances graphiques de MATLAB ne s'effondrent (), je vous conseille de ne faire appel qu'une seule fois à la fonction PATCH. Comme ça, MATLAB n'a à gérer qu'un seul objet Patch.
    oui c'est pour cela que je voulais utiliser qu'une matrice "vertice" et une "face"
    et ne pas avoir à faire de boucle sur le "patch" mais plutot sur la matrice face ou vertice.

    Citation Envoyé par Dut Voir le message
    Il faut donc obtenir les matrices Vertices et Faces complètes avant d'utiliser PATCH.
    oui c'est ce que je voudrais faire car au final ce que je souhaite c'est faire une video avec divers maillage de type "patch"

    Citation Envoyé par Dut Voir le message
    La technique ultime consiste à n'afficher que les faces libres du maillage, puisque ce sont les seules visibles depuis l'extérieur (sauf si on utilise une transparence bien entendu). Il faut donc générer une matrice Faces réduite.
    en fait comme solution de secours je peux en effet n'afficher que les faces mais ce qui m'interesse est bien de faire le maillage complet car je souhaite utiliser la transparence...

    Citation Envoyé par Dut Voir le message
    Et comment fait-on ? Il suffit de chercher les lignes de la matrice Faces qui n'apparaissent qu'une seule fois (avec UNIQUE et HISTC)
    pour ce qui est du maillage des surfaces
    je n'ai pas compris..
    pour chercher les faces qui n'apparaissent qu'une seule fois il faut tout d'abord que j'arrive à construire la matrice Face complete, or c'est cela mon principal probleme.
    ensuite d'accord pour unique mais pourquoi HISTC?? ca sert à tracer des histogrammes non?

    pour ce qui est du maillage du volume
    je pense qu'il doit y avoir une solution simple à partir de la matrice "vertices" que j'ai mis ci dessus. car pour chaque element les noeuds sont données dans le meme sens d'ailleur pour superposer deux carré nous n'avons pas eu de probleme avec "faces+8"

    quand on a fait face+8 ont est arrivé à décaller dans le sens de la hauteur les indices et donc a tracer le carré supérieur.
    ==> je pense qu'on peut faire une operation similaire qui fera un decallage suivant la longueur et un qui fera un decallage suivant la largeur.
    ==> je probleme est que je ne trouve pas comment faire ce decallage

  14. #14
    Invité
    Invité(e)
    Par défaut
    Mon code était plus pour montrer qu'il fallait aussi s'occuper des noeuds, et non seulement des connectivités, que de fournir un code optimisé. Car il te faut s'occuper des deux, choses que tu ne semblais pas comprendre à voir ton code.
    Citation Envoyé par 21did21 Voir le message
    oui c'est pour cela que je voulais utiliser qu'une matrice "vertice" et une "face"
    et ne pas avoir à faire de boucle sur le "patch" mais plutot sur la matrice face ou vertice.
    Pour cela les fonctions kron, repmat et meshgrid te seront fortes utiles

    Citation Envoyé par 21did21 Voir le message
    ensuite d'accord pour unique mais pourquoi HISTC?? ca sert à tracer des histogrammes non?
    >> déterminer le nombre d'éléments différents dans chaque colonne

  15. #15
    Membre éclairé
    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
    Points : 877
    Points
    877
    Par défaut
    d'accord, je regarderai tous cela de plus pret. En tout cas merci beaucoup de votre aide Jerome et DUT c'est tres gentil

    A bientôt

+ 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