如何使用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);
但我想要这个形状?
答案 0 :(得分:40)
Wikipedia上的椭圆文章有一个简单的JavaScript代码来绘制省略号。
它使用参数形式:
x(theta) = a0 + ax*sin(theta) + bx*cos(theta)
y(theta) = b0 + ay*sin(theta) + by*cos(theta)
,其中
(a0,b0) is the center of the ellipse
(ax,ay) vector representing the major axis
(bx,by) vector representing the minor axis
我将代码翻译成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
以及测试它的示例:
%# 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
答案 1 :(得分:12)
我已根据您对excellent ellipse plotting script
的要求,从MATLAB Central中调整了此equation_ellipse http://img121.imageshack.us/img121/5746/eqn1995.pngfunction 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
这是一个以(10,10)
为中心的a = 30
和b = 10
答案 2 :(得分:12)
Jacob和Amro的答案是计算和绘制椭圆点的非常好的例子。我将解决一些简单的方法,你可以绘制椭球 ...
首先,MATLAB有一个内置函数ELLIPSOID,它根据椭球中心和半轴长度生成一组网格点。以下为x,y和z的半轴长度为4,2和1的椭圆体创建矩阵x
,y
和z
方向分别为:
[x, y, z] = ellipsoid(0, 0, 0, 4, 2, 1);
然后,您可以使用函数MESH绘制它,返回绘制曲面对象的句柄:
hMesh = mesh(x, y, z);
如果要旋转绘制的椭球,可以使用ROTATE功能。以下应用围绕y轴旋转45度:
rotate(hMesh, [0 1 0], 45);
然后,您可以调整绘图外观以获得下图:
axis equal; %# Make tick mark increments on all axes equal
view([-36 18]); %# Change the camera viewpoint
xlabel('x');
ylabel('y');
zlabel('z');
此外,如果要使用旋转的绘图点进行进一步计算,可以从绘制的曲面对象中获取它们:
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
答案 3 :(得分:2)
创建两个向量,椭圆体圆周点的x坐标之一,y坐标之一。使这些矢量足够长,以满足您的精度要求。绘制两个向量作为(x,y)对连接起来。我会从你的代码中删除for循环,如果你使用矢量符号则更清楚。另外,我会使用代码的SO标记格式化您的问题,以使您的观众更清楚。
答案 4 :(得分:2)
关于Wikipedia和旋转矩阵的椭圆文章。
重写该功能:
绕rotAngle
逆时针旋转(0,0)
协调转换为(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
以及测试它的示例:
[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;
答案 5 :(得分:-2)
最简单的方法可能是使用Matlab函数
pdeellip(xc,yc,a,b,phi)
例如:
pdeellip(0,0,1,0.3,pi/4)
然而,这是一个简单的解决方案,可以快速浏览一下椭圆的外观。如果你想要一个漂亮的情节,请看其他解决方案。
我不知道在哪个版本的Matlab中添加了它,但它至少可以从R2012b版本开始使用。