MATLAB Language                
            Рисование
        
        
            
    Поиск…
круги
 Самый простой способ рисовать круг - это, очевидно, функция rectangle . 
%// radius
r = 2;
%// center
c = [3 3];
pos = [c-r 2*r 2*r];
rectangle('Position',pos,'Curvature',[1 1])
axis equal
но кривизна прямоугольника должна быть равна 1 !
 Вектор position определяет прямоугольник, первые два значения x и y - нижний левый угол прямоугольника. Последние два значения определяют ширину и высоту прямоугольника. 
pos = [ [x y] width height ]
 В нижнем левом углу круга - да, этот круг имеет углы, мнимые, хотя - это центр c = [3 3] минус радиус r = 2 который [xy] = [1 1] . Ширина и высота равны диаметру круга, поэтому width = 2*r; height = width; 

В случае, если гладкость вышеуказанного решения недостаточна, нет возможности использовать очевидный способ рисования реального круга с помощью тригонометрических функций .
%// number of points
n = 1000;
%// running variable
t = linspace(0,2*pi,n);
x = c(1) + r*sin(t);
y = c(2) + r*cos(t);
%// draw line
line(x,y)
%// or draw polygon if you want to fill it with color
%// fill(x,y,[1,1,1])
axis equal

Стрелы
 Во-первых, можно использовать quiver , где не нужно иметь дело с неуправляемыми нормализованными фигурами с помощью annotation 
drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 )    
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2)

 Важным является 5-й аргумент quiver : 0, который отключает масштабирование по умолчанию по умолчанию, поскольку эта функция обычно используется для построения векторных полей. (или использовать пару значений свойств 'AutoScale','off' ) 
Можно также добавить дополнительные функции:
drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} )       
drawArrow(x1,y1); hold on
drawArrow(x2,y2,'linewidth',3,'color','r')
Если желательны разные стрелки, нужно использовать аннотации (этот ответ может быть полезен. Как изменить стиль стрелочной головки в квадрате колчана? ).
 Размер головки стрелки можно настроить с помощью 'MaxHeadSize' . К сожалению, это непротиворечиво. После этого необходимо установить ограничения по осям. 
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on
xlim([1, 100])
ylim([1, 100])

Существует еще одна настройка для регулируемых головок стрелок:
function [ h ] = drawArrow( x,y,xlimits,ylimits,props )
xlim(xlimits)
ylim(ylimits)
h = annotation('arrow');
set(h,'parent', gca, ...
    'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ...
    'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ...
    props{:} );
end
который вы можете вызвать из своего скрипта следующим образом:
drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on
drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on

Эллипс
Чтобы построить эллипс, вы можете использовать его уравнение . Эллипс имеет основную и малую оси. Также мы хотим иметь возможность построить эллипс в разных центральных точках. Поэтому мы пишем функцию, входы и выходы которой:
Inputs:
    r1,r2: major and minor axis respectively
    C: center of the ellipse (cx,cy)
Output:
    [x,y]: points on the circumference of the ellipse
Вы можете использовать следующую функцию, чтобы получить точки на эллипсе, а затем построить эти точки.
function [x,y] = getEllipse(r1,r2,C)
beta = linspace(0,2*pi,100);
x = r1*cos(beta) - r2*sin(beta);
y = r1*cos(beta) + r2*sin(beta);
x = x + C(1,1);
y = y + C(1,2);
end
Exmaple:
[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);
Многоугольник (ы)
 Создайте векторы для хранения x- и y-расположений вершин, передайте их в patch . 
Одиночный полигон
X=rand(1,4); Y=rand(1,4);
h=patch(X,Y,'red');
Многоугольники
 Каждая вершина полигона занимает один столбец каждого из X , Y 
X=rand(4,3); Y=rand(4,3);
for i=2:3
  X(:,i)=X(:,i)+(i-1); % create horizontal offsets for visibility
end
h=patch(X,Y,'red');
Псевдо 4D сюжет
 (mxn) A (mxn) может представлять собой поверхность с помощью surf ; 
 Цвет поверхности автоматически устанавливается как функция значений в матрице (mxn) . Если цветовая палитра не указана, применяется по умолчанию. 
Цветную панель можно добавить для отображения текущей цветовой карты и указать отображение значений данных в цветовой карте .
 В следующем примере матрица z (mxn) генерируется функцией: 
z=x.*y.*sin(x).*cos(y);
 над интервалом [-pi,pi] . Значения x и y могут быть сгенерированы с использованием функции meshgrid, и поверхность отображается следующим образом: 
% Create a Figure
figure
% Generate the `x` and `y` values in the interval `[-pi,pi]`
[x,y] = meshgrid([-pi:.2:pi],[-pi:.2:pi]);
% Evaluate the function over the selected interval
z=x.*y.*sin(x).*cos(y);
% Use surf to plot the surface
S=surf(x,y,z);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
Рисунок 1
 Теперь может случиться, что дополнительная информация связана со значениями z матрицы, и они хранятся в другой (mxn) матрице 
Можно добавить эту дополнительную информацию на графике, изменив цвет поверхности.
 Это позволит иметь вид 4D-графика: к трехмерному представлению поверхности, сгенерированной первой (mxn) матрицей, четвертое измерение будет представлено данными, содержащимися во второй (mxn) матрице. 
 Такой сюжет можно создать, позвонив по surf с 4 входами: 
surf(x,y,z,C)
 где параметр C является второй матрицей (которая должна быть одного размера z ) и используется для определения цвета поверхности. 
 В следующем примере матрица C генерируется функцией: 
C=10*sin(0.5*(x.^2.+y.^2))*33;
 над интервалом [-pi,pi] 
 Поверхность, порожденная C , 
фигура 2
 Теперь мы можем назвать surf с четырьмя входами: 
figure
surf(x,y,z,C)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
Рисунок 3
Сравнивая рисунки 1 и 3, мы можем заметить, что:
-  форма поверхности соответствует значениям z(первая(mxn)матрица)
-  цвет поверхности (и ее диапазон, заданный цветной панелью) соответствуют значениям C(первая(mxn)матрица)
Рисунок 4
 Конечно, можно поменять z и C на графике, чтобы иметь форму поверхности, заданную матрицей C и цвет, заданный матрицей z : 
figure
surf(x,y,C,z)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
и сравнить рисунок 2 с рисунком 4
Быстрый чертеж
 Существует три основных способа сделать последовательный сюжет или анимацию: plot(x,y) , set(h , 'XData' , y, 'YData' , y) и animatedline set(h , 'XData' , y, 'YData' , y) . Если вы хотите, чтобы ваша анимация была гладкой, вам нужен эффективный рисунок, и три метода не эквивалентны. 
% Plot a sin with increasing phase shift in 500 steps
x = linspace(0 , 2*pi , 100);
figure
tic
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    plot(x,y)
    drawnow
end
toc
 Я получаю 5.278172 seconds . Функция plot в основном удаляет и воссоздает объект линии каждый раз. Более эффективным способом обновления графика является использование свойств XData и YData объекта Line . 
tic
h = [];   % Handle of line object
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    
    if isempty(h)
        % If Line still does not exist, create it
        h = plot(x,y);
    else
        % If Line exists, update it
        set(h , 'YData' , y)
    end
    drawnow
end
toc
 Теперь я получаю 2.741996 seconds , намного лучше! 
 animatedline - относительно новая функция, введенная в 2014b. Посмотрим, как это работает: 
tic
h = animatedline;
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    clearpoints(h)
    addpoints(h , x , y)
    drawnow
end
toc
 3.360569 seconds , не так хорошо, как обновление существующего сюжета, но все же лучше plot(x,y) . 
 Конечно, если вам нужно построить одну строку, как в этом примере, три метода почти эквивалентны и дают плавные анимации. Но если у вас более сложные сюжеты, обновление существующих объектов Line будет иметь значение. 








