Comment dessiner une ellipse et un ellipsoïde à l'aide de MATLAB?
(x^2/a^2)+(y^2/b^2)=1
n=40;
a=0; b=2*pi;
c=0; d=2*pi;
for i=1:n
u=a+(b-a)*(i-1)/(n-1);
for j=1:m
v=a+(d-c)*(j-1)/(m-1);
x(i,j)=sin(u)*cos(v);
y(i,j)=sin(u)*sin(v);
z(i,j)=cos(u);
end
end
mesh(x,y,z);
Mais je veux la forme?
L'article d'Ellipse sur Wikipedia avait un code JavaScript simple pour dessiner des ellipses.
Il utilise la forme paramétrique:
x(theta) = a0 + ax*sin(theta) + bx*cos(theta)
y(theta) = b0 + ay*sin(theta) + by*cos(theta)
où
(a0,b0) is the center of the ellipse
(ax,ay) vector representing the major axis
(bx,by) vector representing the minor axis
J'ai traduit le code dans une fonction MATLAB:
function [X,Y] = calculateEllipse(x, y, a, b, angle, steps)
%# This functions returns points to draw an ellipse
%#
%# @param x X coordinate
%# @param y Y coordinate
%# @param a Semimajor axis
%# @param b Semiminor axis
%# @param angle Angle of the ellipse (in degrees)
%#
narginchk(5, 6);
if nargin<6, steps = 36; end
beta = -angle * (pi / 180);
sinbeta = sin(beta);
cosbeta = cos(beta);
alpha = linspace(0, 360, steps)' .* (pi / 180);
sinalpha = sin(alpha);
cosalpha = cos(alpha);
X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);
if nargout==1, X = [X Y]; end
end
et un exemple pour le tester:
%# ellipse centered at (0,0) with axes length
%# major=20, ,minor=10, rotated 50 degrees
%# (drawn using the default N=36 points)
p = calculateEllipse(0, 0, 20, 10, 50);
plot(p(:,1), p(:,2), '.-'), axis equal
J'ai adapté ceci excellent script de tracé d'ellipse de MATLAB Central pour vos besoins de
function plotEllipse(a,b,C)
% range to plot over
%------------------------------------
N = 50;
theta = 0:1/N:2*pi+1/N;
% Parametric equation of the ellipse
%----------------------------------------
state(1,:) = a*cos(theta);
state(2,:) = b*sin(theta);
% Coordinate transform (since your ellipse is axis aligned)
%----------------------------------------
X = state;
X(1,:) = X(1,:) + C(1);
X(2,:) = X(2,:) + C(2);
% Plot
%----------------------------------------
plot(X(1,:),X(2,:));
hold on;
plot(C(1),C(2),'r*');
axis equal;
grid;
end
Voici une ellipse centrée sur (10,10)
avec a = 30
et b = 10
Les réponses de Jacob et Amro sont de très bons exemples pour calculer et tracer des points pour une ellipse. Je vais aborder quelques façons simples de tracer un ellipsoïde ...
Premièrement, MATLAB a une fonction intégrée ELLIPSOÏDE qui génère un ensemble de points de maillage étant donné le centre de l'ellipsoïde et les longueurs des demi-axes. Ce qui suit crée les matrices x
, y
et z
pour un ellipsoïde centré à l'origine avec des longueurs de demi-axe de 4, 2 et 1 pour les x, y , et directions z, respectivement:
[x, y, z] = ellipsoid(0, 0, 0, 4, 2, 1);
Vous pouvez ensuite utiliser la fonction MESH pour le tracer, en renvoyant une poignée à l'objet surface tracé:
hMesh = mesh(x, y, z);
Si vous souhaitez faire pivoter l'ellipsoïde tracé, vous pouvez utiliser la fonction TOURNER . Ce qui suit applique une rotation de 45 degrés autour de l'axe y:
rotate(hMesh, [0 1 0], 45);
Vous pouvez ensuite ajuster l'apparence du tracé pour obtenir la figure suivante:
axis equal; %# Make tick mark increments on all axes equal
view([-36 18]); %# Change the camera viewpoint
xlabel('x');
ylabel('y');
zlabel('z');
De plus, si vous souhaitez utiliser les points de tracé pivotés pour d'autres calculs, vous pouvez les obtenir à partir de l'objet de surface tracé:
xNew = get(hMesh, 'XData'); %# Get the rotated x points
yNew = get(hMesh, 'YData'); %# Get the rotated y points
zNew = get(hMesh, 'ZData'); %# Get the rotated z points
Article Ellipse sur Wikipedia et Rotation matrix.
Réécrire cela fonctionne:
tourner de rotAngle
dans le sens inverse des aiguilles d'une montre autour de (0,0)
Transformer les coordonnées en (cx, cy)
function [X,Y] = calculateEllipse(cx, cy, a, b, rotAngle)
%# This functions returns points to draw an ellipse
%#
%# @param x X coordinate
%# @param y Y coordinate
%# @param a Semimajor axis
%# @param b Semiminor axis
%# @param cx cetner x position
%# @param cy cetner y position
%# @param angle Angle of the ellipse (in degrees)
%#
steps = 30;
angle = linspace(0, 2*pi, steps);
% Parametric equation of the ellipse
X = a * cos(angle);
Y = b * sin(angle);
% rotate by rotAngle counter clockwise around (0,0)
xRot = X*cosd(rotAngle) - Y*sind(rotAngle);
yRot = X*sind(rotAngle) + Y*cosd(rotAngle);
X = xRot;
Y = yRot;
% Coordinate transform
X = X + cx;
Y = Y + cy;
end
et un exemple pour le tester:
[X,Y] = calculateEllipse(0, 0, 20, 10, 0);
plot(X, Y, 'b'); hold on; % blue
[X,Y] = calculateEllipse(0, 0, 20, 10, 45);
plot(X, Y, 'r'); hold on; % red
[X,Y] = calculateEllipse(30, 30, 20, 10, 135);
plot(X, Y, 'g'); % green
grid on;
Créez deux vecteurs, l'une des coordonnées x des points de la circonférence de l'ellipsoïde, l'une des coordonnées y. Faites ces vecteurs assez longtemps pour satisfaire vos exigences de précision. Tracez les deux vecteurs comme des paires (x, y) jointes. Je laisserais tomber les boucles for de votre code, beaucoup plus clair si vous utilisez la notation vectorielle. Je formaterais également votre question en utilisant le balisage SO pour le code afin de le rendre plus clair pour votre public.