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

  1. #1
    Invité
    Invité(e)
    Représentation d'un ellipsoïde à partir de son equation implicite
    Bonjour,

    j'ai essayé d'effectuer le code suivant pour représenter un ellipsoïde en utilisant une équation implicite, mais sans succès du coup ça serait pour avoir un avis


    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
     
    %d'après wikipedia
    %(x^2/ a^2)+(y^2/ b^2)+(z^2/ c^2) = 1
     
    N = length(x) 
    N1= length(x) 
     
    x = zeros(N1,N)
    y = zeros(N1,N)
    z = zeros(N1,N) 
    for i = 1:N
    for j = 1:N1
        x = 0 : 0.01 : 0.05 
        y = -0.05 : 0.01 : 0.05
        z = -0.05 : 0.01 : 0.05
        a = 0.05
        b = 0.05
        c = 0.05
        [X,Y]  = meshgrid(x,y) 
        x(j,i) = sqrt(1-(y(j,i).^2/b^2)-(Z(j,i).^2/c.^2))*a.^2 %je pense qu'il y a une erreur ici du à mes x,y,z qui n'ont pas la même taille et je dois me tromper sur ma façon d'utiliser meshgrid()
        y(j,i) = sqrt(1-(X(j,i).^2/b^2)-(Z(j,i).^2/c.^2))*b.^2
        z(j,i) = sqrt(1-(X(j,i).^2/a^2)-(Y(j,i).^2/b.^2))*c.^2
     
    end 
    end


    Bien cordialement

  2. #2
    Membre émérite
    Bonjour,

    Une approche.
    Je ne suis pas arrivé à supprimer le plan à Z=0 !

    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
    clear
    %(x^2/ a^2)+(y^2/ b^2)+(z^2/ c^2) = 1
    a = 1;
    b = 0.5;
    c = 0.8;
    figure
    x=linspace(-1,1,20);
    y=linspace(-1,1,20);
    [X,Y]=meshgrid(x,y);
    Z=real(sqrt(1-X.^2/a^2-Y.^2/b^2)*c^2);
    surf(X,Y,Z)
    hold on
    surf(X,Y,-Z)
    axis equal
    axis(2*[-1 1 -1 1 -1 1])
    %colormap(hot)

  3. #3
    Invité
    Invité(e)
    Merci pour cette réponse

  4. #4
    Invité
    Invité(e)
    J'avais fais ceci avant de voir votre poste :

    x = -1:1/100:1;

    z = -1: 2/100 :1;

    N = length(x);

    N1 = length(z);

    Zc = zeros(N1,N);

    Xc = zeros(N1,N);

    for i = 1:N

    for j = 1:N1

    [Xc, Yc] =meshgrid(x,z);

    Zc(j,i) =sqrt(1-(Xc(j,i).^2)/2-(Yc(j,i).^2)/2)/2;

    end

    end

    Xc = 0.05*Xc;

    Yc = Yc;

    Zc = 0.05*Zc;

    surf(Xc,Yc,Zc)

  5. #5
    Invité
    Invité(e)
    je suis parvenu à mixer votre code au mien, je n'avais pas besoin du z
    encore merci

  6. #6
    Invité
    Invité(e)
    enlever le plan z=0
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     for i = 1:N
     for j = 1:N1
      if X(j,i).^2+Y(j,i).^2 >=abs(-1.09);
         X(j,i)= NaN;
    %      Y(j,i)=NaN;
    %      Z(j,i)=NaN;
      end 
     end
     end

    ceci marche mais que pour une demi-sphère

  7. #7
    Membre émérite
    Bonjour,
    En effet. Je voulais un programme sans boucles.

  8. #8
    Invité
    Invité(e)
    supprimer le plan z=0
    Bonjour
    j'ai trouvé, en faisant une boucle en gardant le même point de départ mais du coup j'ai fais un nuage de points

  9. #9
    Membre émérite
    Bonjour,
    Une autre approche :

    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
    clear
    %(x^2/ a^2)+(y^2/ b^2)+(z^2/ c^2) = 1
    a = 1;b = 0.5;c = 0.8;
    figure
    x=linspace(-1,1,20);
    y=x;
    [X,Y]=meshgrid(x,y);
    f=sqrt(1-X.^2/a^2-Y.^2/b^2)*c^2;
    Z=real(f);
    N=20;
    [Mh,ch]=contour3(X,Y,Z,N);
    set(ch,'LineWidth',3)
    set(ch,'EdgeColor','r')
    hold on
    [Mb,cb]=contour3(X,Y,-Z,N);
    set(cb,'LineWidth',3)
    set(cb,'EdgeColor','r')
    axis equal
    axis(2*[-1 1 -1 1 -1 1])
    rotate3d on
    view(15,25)

  10. #10
    Invité
    Invité(e)
    Je poste mon 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
     
     
    clear all
    clc
    a= 0.5
    b = 0.5
    c = 0.6
    x = linspace(-0.5,0.5,100)
    y = linspace(-0.5,0.5,100)
    z =linspace(0,1,100)
    N = length(x);
    N1 = length(y)
    Yc = zeros(N,N1);
    Zc = zeros(N,N1);
    X = [];
    Y =[];
    Z = [];
     
     
     
    for i = 1:N
     
    for j = 1:N1
     
    [Xc(i,j), Yc(i,j)] = meshgrid(x(i),y(j));
    Zc(i,j) =real(sqrt(1-(Xc(i,j).^2)/a.^2-(Yc(i,j).^2)/b^2 )*c^2);
     
     if (Xc(i,j).^2+Yc(i,j).^2 >=abs(-0.27));
           Xc(i,j)= NaN;
    %       Y(j,i)=NaN;
    %        %Z(j,i)=NaN;
     end 
     
     
     X = [Xc;-Xc];
     Y = [Yc;-Yc];
     Z = [Zc;-Zc];
     
    end
     
    end
     
    surf(X,Y,Z)


    Merci

  11. #11
    Rédacteur/Modérateur

    Si les axes de l’ellipsoïde correspondent au repère (X,Y,Z), il suffit de déformer une sphère :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a = 0.5;
    b = 0.5;
    c = 0.6;
     
    [x, y, z] = sphere(150);
     
    x = a*x;
    y = b*y;
    z = c*z;
     
    figure
    surf(x, y, z)
    axis vis3d tight equal
    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)