수색…


서클

원을 그릴 수있는 가장 쉬운 방법은 분명히 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 벡터는 사각형을 정의하고 처음 두 값인 xy 는 사각형의 왼쪽 아래 모서리입니다. 마지막 두 값은 사각형의 너비와 높이를 정의합니다.

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

여기에 이미지 설명을 입력하십시오.

화살

첫째, annotation 을 사용하여 불규칙한 정규화 된 그림 단위를 처리 할 필요가없는 quiver 을 사용할 수 있습니다.

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)

여기에 이미지 설명을 입력하십시오.

중요한 것은 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

예시 :

[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);

여기에 이미지 설명을 입력하십시오.

다각형

버텍스의 x 위치와 y 위치를 유지하는 벡터를 만들어이를 patch 로 공급 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');

3 개의 다각형

가짜 4D 플롯

(mxn) 행렬을 이용하여 표면에서 representes 될 수 서핑 ;

곡면의 색은 (mxn) 행렬에있는 값의 함수로 자동 설정됩니다. 색상 맵을 지정하지 않으면 기본값이 적용됩니다.

현재의 색상 맵을 표시하고 데이터 값을 색상 맵에 매핑하기 위해 색상 막대를 추가 할 수 있습니다.

다음 예제에서 z (mxn) 행렬은 함수에 의해 생성됩니다.

z=x.*y.*sin(x).*cos(y);

간격 [-pi,pi] 걸쳐서. xy 값은 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) 행렬에 의해 생성 된 표면의 3D 표현에 대해 네 번째 차원은 두 번째 (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

이제 4 개의 입력으로 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

물론, 플롯에서 zC 를 교체하여 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 은 순차적 인 플롯 또는 애니메이션을 수행하는 세 가지 주요 방법이 있습니다. 애니메이션을 부드럽게하려면 효율적인 드로잉이 필요하며 세 가지 방법이 동일하지 않습니다.

% 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 얻는다. 플롯 기능은 기본적으로 매회 라인 오브젝트를 삭제하고 다시 만듭니다. 플롯을 업데이트하는 더 효율적인 방법은 Line 객체의 XDataYData 속성을 사용하는 XData 입니다.

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 객체를 업데이트하면 차이가 발생합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow