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 :

Tracé d'une surface 3D


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut Tracé d'une surface 3D
    Bonjour,

    J'ai 3 vecteurs X <1x700 double>, Y <1x700 double> et Z <1x700 double> qui m'ont permis d'obtenir le tracé 3D suivant avec 'scatter3(X,Y,Z)':

    Nom : fig_forum.png
Affichages : 2658
Taille : 30,8 Ko

    Auriez-vous une idée pour savoir comment je peux tracer une surface passant par tous ces points et faire varier la couleur de cette surface en fonction des valeurs de Z.

    Merci beaucoup pour votre aide.

  2. #2
    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 163
    Points
    53 163
    Par défaut
    Utilise les fonctions griddata ou TriScatteredInterp

    Tu trouveras des exemples en effectuant une recherche sur ce forum.
    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)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonsoir,

    Merci pour ton aide. J'ai essayé les deux méthodes griddata et TriScatteredInterp et ai réussi à obtenir le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    % Tracé 3D: Méthode TriScatteredInterp
    F1 = TriScatteredInterp(X,Y,Z);
    [qx,qy] = meshgrid(X,Y);
    qz = F1(qx,qy);
    figure(1);
    mesh(qx,qy,qz); hold on;
    plot3(X,Y,Z,'o');
     
    %Tracé 3D: Méthode griddata
    [xg,yg] = meshgrid(X,Y);
    zg = griddata(X,Y,Z,xg,yg);
    figure(2);
    mesh(xg,yg,zg); hold on;
    plot3(X,Y,Z,'o');
    Nom : untitled.png
Affichages : 2691
Taille : 82,6 Ko

    Par contre, j'ai encore un souci. C'est qu'à la différence des exemples de tracés 3D sur Matlab, je n'ai pas les vecteurs X et Y répartis de manière régulière. En effet, parmi les 700 points que j'ai, il y a 100 points qui ont les mêmes coordonnées de x. En d'autres termes, pour un x donné, j'ai 100 points définis dans les coordonnées (Y,Z). Du coup, en obtenant la surface passant par tous les points que je souhaite, j'ai eu aussi la surface verticale contenue dans le plan (y,z) (voir figure suivante):

    Questions:
    1) Pouvez-vous m'aider à définir la fonction griddata (ou une autre) pour ne obtenir que la surface voulue?

    2) De plus, avez-vous des idées pour avoir une bonne qualité de visualisation pour cette image?

    Merci pour votre aide.

  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 163
    Points
    53 163
    Par défaut
    Pourrais-tu nous fournir un jeu de données ?
    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
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Ci-joint mes trois vecteurs X, Y, Z en .mat dans un fichier zip.
    J'espère que cela vous ira. Merci pour votre aide.
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip XYZ.zip (11,0 Ko, 137 affichages)

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    Salut

    en effet griddata et triscatteredinterp sont un peu bourrin dans leur interpolations
    cependant d'après ton graph, il semblerait que tu ne ne leur ai pas demander d'interpoler vraiement : il faudrait que tes qx, qy et xg, yg soient plus définis
    là tu les construit à partir des vecteur X et Y de tes données : il faut donner à meshgrid des vecteurs avec plus de points
    ensuite griddata et triscatteredinterp feront de l'interpolation

    je te conseille aussi de regarder la fonction gridfit dispo sur matlab central
    la surface obtenue ne passera pas forcement exactement sur les points contrairement au deux autres fonctions mais le résultat sera peut être plus proche de tes attentes

    sinon pour ce type d'affichage mesh est très bien


    Fabien

  7. #7
    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 163
    Points
    53 163
    Par défaut
    [edit] Grillé par Fabien

    Essaie avec la contribution Surface Fitting using gridfit

    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
    load X
    load Y
    load Z
     
    % Suppression des NaN
    idx = any(isnan([X Y Z]),2);
    X(idx) = []; Y(idx) = []; Z(idx) = [];
     
    % Suppression des doublons
    [~,idx] = unique([X Y Z], 'rows');
    X = X(idx); Y = Y(idx); Z = Z(idx);
     
    % Approximation de la surface avec gridfit
    % http://www.mathworks.com/matlabcentral/fileexchange/8998-surface-fitting-using-gridfit
    xi = linspace(min(X), max(X), 50);
    yi = linspace(min(Y), max(Y), 50);
    zi = gridfit(X, Y, Z, xi, yi);
     
    figure
     
    plot3(X,Y,Z,'r*')
    hold on
    surf(xi, yi, zi)
     
    axis tight vis3d
    grid on
    Images attachées Images attachées  
    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)

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Super! La surface montrée dans la figure est exactement ce que je souhaite obtenir.

    Néanmoins, il me semble que mon Matlab (Matlab2012b version 32bits) n'a pas de fonction 'gridfit'. Je me souviens pourtant d'avoir installé toutes les toolbox.

    Voici le message que j'ai eu:

    Nom : gridfit.PNG
Affichages : 2292
Taille : 4,5 Ko

    Comment est ce que je peux installer la fonction 'gridfit'?

    Merci beaucoup pour votre aide.

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Citation Envoyé par Dut
    Essaie avec la contribution Surface Fitting using gridfit
    Par contribution, Dut entend une fonction qui a été proposé par un utilisateur de MATLAB à la communauté. Il faut donc que tu ailles sur le lien proposer par Dut, que tu télécharges ce(tte) fonction/script afin de pouvoir l'utiliser!
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  10. #10
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    Citation Envoyé par SCIEBOU Voir le message
    Comment est ce que je peux installer la fonction 'gridfit'?
    y a le lien dans mon msg précédent

    Citation Envoyé par SCIEBOU Voir le message
    Je me souviens pourtant d'avoir installé toutes les toolbox.
    hummm ... soit t'es très riche, soit tu devrais rester plus discret

  11. #11
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    Citation Envoyé par Dut Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ...
    xi = linspace(min(X), max(X), 50);
    yi = linspace(min(Y), max(Y), 50);
    ca c'est le truc qui manquait à ton premier code et qui aurait améliorer le résultat via griddata
    (mais pas au point de ce que retourne gridfit)

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Génial!!! Merci beaucoup pour votre aide.
    Je suis très content d'avoir une surface si bien dessinée!!!

    Bon WE.

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

Discussions similaires

  1. Tracé d'une surface avec une base de disque
    Par Winounet dans le forum MATLAB
    Réponses: 7
    Dernier message: 27/05/2014, 12h23
  2. [Débutant] Calcul et tracé d'une surface 3D
    Par mantus dans le forum MATLAB
    Réponses: 13
    Dernier message: 10/06/2011, 12h01
  3. Tracé d'une surface.
    Par george33 dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/03/2010, 18h24
  4. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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