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 :

[plot3D] lissage entre points 3D avec couleur


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut [plot3D] lissage entre points 3D avec couleur
    Bonjour,

    J'ai des couples de points X, Y et Z (trois vecteurs).

    J'arrive à tracer ma courbe en 3D avec plot3 mais comment puis-je lisser cette courbe puis inclure des niveaux de couleurs proportionnels aux valeurs en Z ?

    Sinon, comment puis-je réaliser un plot 2D (X, Y) avec un niveau de couleur en Z et des lignes de niveaux tout en ayant ne voyant pas mes points...

    J'espère avoir été assez clair

    Merci pour votre aide

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 953
    Points : 457
    Points
    457
    Par défaut
    Citation Envoyé par christophe_halgand Voir le message
    Bonjour,

    J'ai des couples de points X, Y et Z (trois vecteurs).

    J'arrive à tracer ma courbe en 3D avec plot3 mais comment puis-je lisser cette courbe puis inclure des niveaux de couleurs proportionnels aux valeurs en Z ?
    J'ai rarement utilisé ces commandes mais peut etre que INTERP3 ou GRIDDATA t'aideront.

    Citation Envoyé par christophe_halgand Voir le message
    Sinon, comment puis-je réaliser un plot 2D (X, Y) avec un niveau de couleur en Z et des lignes de niveaux tout en ayant ne voyant pas mes points...
    Citation Envoyé par christophe_halgand Voir le message
    J'espère avoir été assez clair

    pas compris
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Je vais regarder pour "interp3"

    Sinon pour le 2D, imagine toi une courbe de gauss 3D que tu aplatis en 2D mais pour garder une idée de densité, tu viens jouer sur la couleur.

    C'est en gros faire un plot de mes X et Y et utiliser ma variable Z pour définir un code couleur...

    J'espère que c'est mieux ainsi

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Je suis toujours bloqué...

    Personne n'a d'idée pour m'aider...

    Voici mon bout de code pour l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    figure
    plot3(dhv(:,1),dhv(:,2),adr,'bo')
    xlabel('x')
    ylabel('z')
    zlabel('activity')
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2007
    Messages : 9 458
    Points : 14 709
    Points
    14 709
    Par défaut
    Salut,

    Je ne suis pas du tout sure mais je me dis que ça se ressemble, et d'un autre côté je me dis que tu as déjà du tombé sur cette discussion, enfin je me lance
    => graphe x, y, z avec z en couleur

    ça te donne des idées ?

    Sinon y aurait-il possibilité :
    - que tu nous fasse un petit exemple avec des vraies valeurs pour qu'on teste ?
    - que tu nous fasse un joli dessin de ce que tu veux ?
    Règles du Forum

    Adepte de la maïeutique

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Salut la miss,

    Et oui, j'ai déjà lu...

    Pour te donner un exemple de données :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    function apr = fa_pr(px,pz)
     
        apr  = zeros(253,1);
        xz   = zeros(253,2);
        m    = 1;
     
        % définir x et z
        x    = -90:10:90;
        z    = x;
     
        for t=1:length(x)
            for y=1:length(z)
                if sqrt((x(t))^2+(z(y))^2)<=90
                    xz(m,:)= [x(t),z(y)];
                    m      = m+1;
                end
            end
        end
     
    %     %% test sur les coordonnées xz
    %     XCentre = 0;
    %     YCentre = 0;
    %     Rayon = 90;
    %     VTheta = 0:pi/180:360*pi/180;
    %     XCercle = XCentre + Rayon * cos(VTheta);
    %     YCercle = YCentre + Rayon * sin(VTheta);
    %     plot(XCercle, YCercle)
    %     figure
    %     hold on
    %     plot(xz(:,1),xz(:,2),'x')
    %     plot(XCercle, YCercle)
    %     %% fin test
     
        sigma = 20;
     
        for s=1:length(xz)
            apr(s) = exp(-((px-xz(s,1))^2+(pz-xz(s,2))^2)/(2*sigma^2));
        end
     
        %% test de représentation 3D
        figure
        plot3(xz(:,1),xz(:,2),apr)
        xlabel('x')
        ylabel('z')
        zlabel('activity')
    end
    Voici mon bout de code fait en speed.

    Vous pouvez essayer d'utiliser cette fonction comme ceci :
    Vous devriez obtenir cette courbe jointe.

    Merci

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Re,

    En modifiant mes dernières lignes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %% test de représentation 3D
        figure
        hold on
        scatter3(xz(:,1),xz(:,2),apr,5,apr,'markerfacecolor','flat')
        colorbar;
        xlabel('x')
        ylabel('z')
        zlabel('activity')
    J'obtiens ainsi les points (X,Y,Z) en 3D et avec une couleur lié à mon axe z.

    Peut-on lisser la courbe 3D ?

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Ingénieur R&D freelance
    Inscrit en
    novembre 2006
    Messages
    20 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D freelance

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 008
    Points : 53 986
    Points
    53 986
    Par défaut
    Essaie ceci :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    function apr = fa_pr(px,pz)
    
        apr  = zeros(253,1);
        xz   = zeros(253,2);
        m    = 1;
        
        % définir x et z
        x    = -90:10:90;
        z    = x;
    
        for t=1:length(x)
            for y=1:length(z)
                if sqrt((x(t))^2+(z(y))^2)<=90
                    xz(m,:)= [x(t),z(y)];
                    m      = m+1;
                end
            end
        end
        
    %     %% test sur les coordonnées xz
    %     XCentre = 0;
    %     YCentre = 0;
    %     Rayon = 90;
    %     VTheta = 0:pi/180:360*pi/180;
    %     XCercle = XCentre + Rayon * cos(VTheta);
    %     YCercle = YCentre + Rayon * sin(VTheta);
    %     plot(XCercle, YCercle)
    %     figure
    %     hold on
    %     plot(xz(:,1),xz(:,2),'x')
    %     plot(XCercle, YCercle)
    %     %% fin test
        
        sigma = 20;
    
        for s=1:length(xz)
            apr(s) = exp(-((px-xz(s,1))^2+(pz-xz(s,2))^2)/(2*sigma^2));
        end
        
        [xi,yi] = meshgrid(linspace(min(xz(:,1)),max(xz(:,1)),100),linspace(min(xz(:,2)),max(xz(:,2)),100));
        apri = griddata(xz(:,1),xz(:,2),apr,xi,yi);
        
        %% test de représentation 3D
        figure
    
        plot3(xz(:,1),xz(:,2),apr,'r*')
        hold on
        surf(xi,yi,apri)
        
        xlabel('x')
        ylabel('z')
        zlabel('activity')
    end
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et 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)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Salut Dut,

    Que dire... Magnifique...

    Sinon, voici ce que j'avais réussit à faire :

    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
    %% test mesh
    px = -20;
    pz = 20;
     
    x    = -90:10:90;
    z    = x;
     
    sigma = 20;
     
    [X,Y] = meshgrid(x,z);
     
    Z = exp(-((px-X).^2+(pz-Y).^2)/(2*sigma^2));
     
    figure
    meshc (X , Y , Z)
    figure
    surf(X , Y , Z)
    figure
    contour(X,Y,Z)
    Mon problème devenait ce cercle mais tu l'as résolu...

    Je vais tester ton code sur un autre bout de code où mes données sont dans une ellipse...

    En tout cas merci.
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    Re,

    Je suppose que c'est l'utilisation de la fonction "linspace" qui me génère des problèmes de dimensions...

    Quelqu'un peut-il m'aider ?

    voici ce fameux bout de code :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    %% Fonction d'activation : disparité rétinienne
     
    function adr = fa_dr(dh,dv)
     
        adr  = zeros(64,1);
        dhv   = zeros(64,2);
        m    = 1;
        a0   = 1;
        a1   = 0.35;
     
        %% définir x et z
     
        %%  cercle inf à 2
        x    = -2:1:2;
        z    = -2:1:2;
     
        for t=1:length(x)
            for y=1:length(z)
                if sqrt((x(t))^2+(z(y))^2)<=2
                    dhv(m,:)= [x(t),z(y)];
                    m      = m+1;
                end
            end
        end
     
     
        %% cercle inf à 10 mais sup 2
        x    = -10:5:10;
        z    = -10:5:10;
     
        for t=1:length(x)
            for y=1:length(z)
                if sqrt((x(t))^2+(z(y))^2)<=10 && sqrt((x(t))^2+(z(y))^2)>2
                    dhv(m,:)= [x(t),z(y)];
                    m      = m+1;
                end
            end
        end
     
        %% ellipse 45,30 mais sup à cercle 10
        x   = -50:10:50;
        z   = -30:10:30;
     
        ae = 45;
        be = 30;
        for t=1:length(x)
            for y=1:length(z)
                F2 = sqrt(ae^2-be^2);
                F1 = -F2;
                d1 = sqrt(z(y)^2+(x(t)-F2)^2);
                d2 = sqrt(z(y)^2+(x(t)-F1)^2);
                if sqrt((x(t))^2+(z(y))^2)>10 && (d1+d2)<=2*ae
                    dhv(m,:)= [x(t),z(y)];
                    m       = m+1;
                end
            end
        end
     
     
     
    %     %% test sur les coordonnées xz
    %     x=-45:0.1:45;
    %     y=sqrt(30^2-30^2*(x.^2/45^2));
    %     y1=-y;
    %     figure
    %     hold on
    %     plot(x,y)
    %     plot(x,y1)
    %     plot(dhv(:,1),dhv(:,2),'x')
    %     %% fin test
     
        sigma = sqrt((dh^2+dv^2)/2);
        if sigma<10/60
            sigma = 10/60;
        end
     
        for s=1:length(dhv)
            if dhv(s,1)<=-1
                ahdr   = a0 * exp(-(dh-dhv(s,1))^2/sigma^2) - a1 * exp(-(dh-dhv(s,1)-sigma^2)^2/sigma^2);
                avdr   = a0 * exp(-(dv-dhv(s,2))^2/sigma^2) - a1 * exp(-(dv-dhv(s,2)-sigma^2)^2/sigma^2);
            elseif dhv(s,1)>=1
                ahdr   = a0 * exp(-(dh-dhv(s,1))^2/sigma^2) - a1 * exp(-(dh-dhv(s,1)+sigma^2)^2/sigma^2);
                avdr   = a0 * exp(-(dv-dhv(s,2))^2/sigma^2) - a1 * exp(-(dv-dhv(s,2)+sigma^2)^2/sigma^2);
            elseif dhv(s,1)<1 && dhv(s,1)>-1
                ahdr   = a0 * exp(-(dh-dhv(s,1))^2/sigma^2);
                avdr   = a0 * exp(-(dv-dhv(s,2))^2/sigma^2);
            end
            adr(s) = ahdr * avdr;
        end
     
       [xi,yi] = meshgrid(linspace(min(dhv(:,1)),max(dhv(:,1)),100),linspace(min(dhv(:,1)),max(dhv(:,2)),100));
       adri = griddata(dhv(:,1),dhv(:,2),adr,xi,yi);
     
        %% test de représentation 3D
        figure
        plot3(dhv(:,1),dhv(:,2),adr,'r*')
        hold on
        size(dhv)
        size(adri)
        surf(dhv(:,1),dhv(:,2),adri)
        plot3(2,1,1,'bo');
        xlabel('x - horizontal')
        ylabel('z - vertical')
        zlabel('activity')
    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Ingénieur R&D freelance
    Inscrit en
    novembre 2006
    Messages
    20 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D freelance

    Informations forums :
    Inscription : novembre 2006
    Messages : 20 008
    Points : 53 986
    Points
    53 986
    Par défaut
    Autre chose, je pense que tu as du le remarquer mais tu peux changer le type d'interpolation dans GRIDDATA...
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et 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)

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : octobre 2007
    Messages : 769
    Points : 724
    Points
    724
    Par défaut
    En effet, Dut, je l'avais lu dans l'aide de matlab...

    Merci beaucoup

    A bientôt

    Christophe
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/02/2011, 23h54
  2. Réponses: 2
    Dernier message: 04/04/2006, 11h34
  3. PopupMenu : afficher un dessin avec couleur personnalisée
    Par MiJack dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/02/2006, 13h54
  4. Correlation entre points .
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 23
    Dernier message: 23/06/2005, 12h57
  5. [VB.NET] Brush avec couleur définie en RGB
    Par jennings dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/12/2004, 09h41

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