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
화살
첫째, 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');
가짜 4D 플롯
(mxn)
행렬을 이용하여 표면에서 representes 될 수 서핑 ;
곡면의 색은 (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)
행렬에 의해 생성 된 표면의 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
물론, 플롯에서 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
은 순차적 인 플롯 또는 애니메이션을 수행하는 세 가지 주요 방법이 있습니다. 애니메이션을 부드럽게하려면 효율적인 드로잉이 필요하며 세 가지 방법이 동일하지 않습니다.
% 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
객체의 XData
및 YData
속성을 사용하는 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
객체를 업데이트하면 차이가 발생합니다.