рисовать эллипс и эллипсоид в MATLAB - PullRequest
13 голосов
/ 28 января 2010

Как нарисовать эллипс и эллипсоид с помощью 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);

Но я хочу форму?

Ответы [ 6 ]

40 голосов
/ 28 января 2010

Статья об эллипсе в Википедии содержит простой код 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:

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

и пример для проверки:

%# 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

example rotated ellipse

12 голосов
/ 28 января 2010

Ответы от Джейкоба и Амро являются очень хорошими примерами для вычисления и построения точек для эллипса. Я расскажу о некоторых простых способах, которыми вы можете построить эллипсоид ...

Во-первых, 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 . Следующее применяется вращение на 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');

enter image description here

Кроме того, если вы хотите использовать повернутые точки графика для дальнейших вычислений, вы можете получить их из объекта построенной поверхности:

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
12 голосов
/ 28 января 2010

Я адаптировал превосходный сценарий построения эллипса от MATLAB Central для ваших требований equation_ellipse

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

Примечание: измените N, чтобы определить разрешение вашего эллипса

Вот эллипс с центром в (10,10) с a = 30 и b = 10

Ellipse

2 голосов
/ 21 июня 2017

Статья эллипса на Википедии и матрица вращения.

Переписать, что функционирует:

  • повернуть на 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;

Figure 1

2 голосов
/ 28 января 2010

Создайте два вектора, одну из x-координат точек окружности эллипсоида, одну из y-координат. Сделайте эти векторы достаточно длинными, чтобы удовлетворить ваши требования к точности. Постройте два вектора как пары (x, y), соединенные вместе. Я бы исключил циклы for из вашего кода, гораздо понятнее, если вы используете векторную запись. Также я отформатировал бы ваш вопрос, используя SO разметку для кода, чтобы сделать его понятнее вашей аудитории.

0 голосов
/ 02 июля 2014

Самый простой способ - использовать функцию Matlab

pdeellip(xc,yc,a,b,phi) 

Например:

pdeellip(0,0,1,0.3,pi/4) 

Тем не менее, это простое решение - хорошо бы быстро взглянуть на то, как выглядит эллипс. Если вы хотите получить хороший сюжет, посмотрите другие решения.

Я не знаю, в какой версии Matlab это было добавлено, но оно доступно по крайней мере начиная с версии R2012b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...