codigo - ecuacion de la elipse en matlab
dibujar elipse y elipsoide en MATLAB (6)
He adaptado este excelente guión de trazo de elipse de MATLAB Central para su requisito de equation_ellipse http://img121.imageshack.us/img121/5746/eqn1995.png
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
Nota: cambie N para definir la resolución de su elipse
Aquí hay una elipse centrada en (10,10)
con a = 30
b = 10
¿Cómo dibujo una elipse y un elipsoide usando 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);
Pero quiero la forma?
Crea dos vectores, una de las coordenadas x de los puntos de la circunferencia del elipsoide, una de las coordenadas y. Haga que estos vectores sean lo suficientemente largos como para satisfacer sus requisitos de precisión. Trace los dos vectores como pares (x, y) unidos. Soltaría los bucles for de tu código, mucho más claro si usas la notación vectorial. También formatearé tu pregunta usando el marcado SO para el código para que todo quede más claro para tu audiencia.
El artículo de Ellipse en Wikipedia tenía un código JavaScript simple para dibujar elipses.
Utiliza la forma paramétrica:
x(theta) = a0 + ax*sin(theta) + bx*cos(theta)
y(theta) = b0 + ay*sin(theta) + by*cos(theta)
dónde
(a0,b0) is the center of the ellipse
(ax,ay) vector representing the major axis
(bx,by) vector representing the minor axis
Traducí el código en una función de MATLAB:
calculateEllipse.m
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
y un ejemplo para probarlo:
%# 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
La forma más simple podría ser utilizar la función Matlab
pdeellip(xc,yc,a,b,phi)
Por ejemplo:
pdeellip(0,0,1,0.3,pi/4)
Sin embargo, esta es una solución simple, es bueno echar un vistazo rápido a cómo se ve la elipse. Si quieres tener una buena trama, mira las otras soluciones.
No sé en qué versión de Matlab se agregó, pero está disponible al menos desde la versión R2012b en adelante.
Las respuestas de Jacob y Amro son muy buenos ejemplos para calcular y trazar puntos para una elipse. Trataré algunas formas fáciles de trazar un elipsoide ...
En primer lugar, MATLAB tiene una función ELLIPSOID incorporada que genera un conjunto de puntos de malla dado el centro elipsoide y las longitudes de semiejes. A continuación, se crean las matrices x
, y
y z
para un elipsoide centrado en el origen con longitudes de semiejes de 4, 2 y 1 para las direcciones x, y y z, respectivamente:
[x, y, z] = ellipsoid(0, 0, 0, 4, 2, 1);
A continuación, puede usar la función MESH para trazarlo y devolver un identificador al objeto de superficie trazado:
hMesh = mesh(x, y, z);
Si desea rotar el elipsoide trazado, puede usar la función ROTAR . Lo siguiente aplica una rotación de 45 grados alrededor del eje y:
rotate(hMesh, [0 1 0], 45);
A continuación, puede ajustar la apariencia de la gráfica para obtener la siguiente figura:
axis equal; %# Make tick mark increments on all axes equal
view([-36 18]); %# Change the camera viewpoint
xlabel(''x'');
ylabel(''y'');
zlabel(''z'');
Además, si desea utilizar los puntos de trazado girados para realizar más cálculos, puede obtenerlos del objeto de superficie trazado:
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
Artículo elipse en Wikipedia y matriz de rotación.
Reescribe esas funciones:
rotar por
rotAngle
en sentido antihorario alrededor(0,0)
Transformación de coordenadas a
(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
y un ejemplo para probarlo:
[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;