Как я тяну эллипс и использование эллипсоида 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);
Но я хочу форму?
Я адаптировал этот отличный сценарий построения эллипса из MATLAB Central для вашего требования
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
Вот эллипс с центром в (10,10)
с a = 30
и b = 10
Ответы из jacob и AMRO являются очень хорошими примерами для вычислений и точек заговора для эллипса. Я решаю несколько простых способов, которыми вы можете построить эллипсоид ...
. Во-первых, MATLAB имеет встроенный функцию эллипсоида , который генерирует набор точек сетки, учитывая эллипсоид Центр и полуоси длины. Следующее создает матрицы x
, y
, а Z
для эллипсоида, сосредоточенного в начале происхождения с полуосевыми длинами 4, 2 и 1 для X, Y и Z Направления соответственно:
[x, y, z] = ellipsoid(0, 0, 0, 4, 2, 1);
Вы можете использовать функцию сетка , чтобы построить его, возвращая ручку на объект поверхности нанесенной нанесенной нанесенной нанесенной поверхности:
hMesh = mesh(x, y, z);
Если вы хотите повернуть гранул , вы можете использовать вращать функцию. Следующее относится к вращению 45 градусов вокруг оси Y:
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
Статья Эллипса на 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
Создание двух векторов, один из X-координат точек окружности эллипсоида, один из Y-координат. Сделайте эти векторы достаточно долго, чтобы удовлетворить ваши требования к точности. Сюжет два вектора как (X, Y) пар соединен вверх. Я бы бросил петли из вашего кода, гораздо яснее, если вы используете векторную запись. Также я отформатировал ваш вопрос, используя настолько разметки для кода, чтобы сделать все это более понятнее для вашей аудитории.