본문 바로가기
매트랩(Matlab)/매트랩 질문모음

[Matlab / 매트랩] 극좌표계(polar coordinate) 그래프 그리기

by freezkim 2010. 2. 3.

Q. 2차 극 좌표계 데이터(r,theta)를 가지고 있는데 어떻게 그래프를 그려야 하나요?

기본적으로 plot명령어는 cartesian coordinate, 즉 직교 좌표계의 데이터가 주어졌을 때 그래프를 그려줍니다.
하지만 극 좌표계 데이터(거리, 각도)로 주어졌을 때는 어떻게 그래프를 그려야 할까요?

이때는 polar(각도,거리) 라는 함수를 써 주시면 됩니다.

예를들어 r^2 = 4*cos(theta), theta는 0~2pi까지의 범위의 그래프를 그리고 싶을 땐,

theta = 0:0.01:2*pi;

r1 = sqrt(4.*cos(theta));

r2=-sqrt(4.*cos(theta));


polar(theta, r1)

hold on

polar(theta,r2)


과 같은 형식으로 그려주면 됩니다. 이때 데이터를 r1,r2 로 각각 분리해서 그린 후 합친 이유는 설명안해도....아시겠지요?

결과는 요렇게 되네요:




자, 그런데 이 경우는 극 좌표계 상에서의 그래프가 표시됩니다. 각도와, 거리의 형태로 표시가 되는 거죠.
요걸 x,y축에 대한 직교 좌표계 상에서 그려 주려면 극 좌표계 상에서 나타난 데이터를 직교 좌표계 상의 데이터(x,y)로 바꿔 주면 됩니다.

이때 쓰이는 함수는 pol2cart입니다. (polar to cartesian coordinate) 밑에서 설명을 해 놓았으니 일단 코드와 그 결과만 보도록 하죠.

theta = 0:0.01:2*pi;

r1 = sqrt(4.*cos(theta));
r2=-sqrt(4.*cos(theta));
[x1,y1]=pol2cart(theta,r1);
[x2,y2]=pol2cart(theta,r2);
plot(x1,y1)
hold on
plot(x2,y2)
axis([-2 2 -2 2])


극 좌표계에서나 직교 좌표계에서나 같은 형태의 그래프가 나오게 됩니다.
 









Q. 3차 극 좌표계 데이터(r,theta,z)를 가지고 있는데 어떻게 그래프를 그려야 하나요?


3차 극 좌표계 데이터를 가지고 있는 경우, plot3 처럼 polar3을 이용하면 참 좋겠습니다만,
제가 쓰는 버전의 매트랩에서는 구현이 되어 있지 않습니다.(뒷 버전에는 있는지 없는지는 잘...)

여튼 그래서 어쩔 수 없이 그려볼려고 별 짓을 다 해본 결과

결국에는 걍 극 좌표계 데이터를 직교 좌표계로 변환하여
mesh를 이용해서 구하는 방법밖에는....없는 것 같더군요.


즉, 거리 각도 데이터를 r, theta 형식이 아닌 x,y좌표로 옮기는 과정을 거치는 거지요.

다행이도, 매트랩에서는 pol2cart 라는 함수를 제공해주어 이러한 과정을 코딩이 가능하도록 합니다.

따라서 거리 r이 0~100으로 theta가 0~pi까지, 그리고 그 각각에 해당하는 높이값 z데이터가 이렇게 주어진다면
z=
[304.5  304.6  304.6  304.5  304.4  303.9  303.8  302.4  302.7  303.0  304.9
304.5  303.0  302.9  303.0  302.6  302.3  301.5  301.4  302.5  303.1  303.9
304.5  304.6 303.8 304.2 303.5 303.3 302.6 302.2 302.3 303.4 305.5
304.5  305.5 304.5 305.1 304.9 304.3 303.5 303.1 303.6 303.9 304.9
304.5  304.3 304.4 304.2 304.1 304 304 303.4 303.6 304 305.9
304.5  303 303.3 303.5 302.9 302.8 302.4 302.7 301.8 302.3 303.3
304.5  304.3  303.9  303.7  303.5  303.2  302.8  302.2  303.1  303.6  305.6
304.5  304.3  303.9  303.7  303.5  303.2  302.8  302.2  303.1  303.6  305.6
304.5  304.6  304.6  304.5  304.4  303.9  303.8  302.4  302.7  303.0  304.9];

이런 식으로 극좌표계의 3차원 그래프를 그리는 것이 가능하게 됩니다.

r=[0:10:100];
theta=[0:0.01:2*pi];
// 거리와 각도를 데이터로 입력하였습니다.

[R.THETA] = meshgrid(r,theta);
// 3차원 그래프를 그리기 위해 meshgrid 함수를 써서, 거리와 각도 데이터를 행렬 형식으로 변환하였습니다.
(meshgrid에 대한 내용은 매트랩 강의 3차원 그래프 그리기를 참조해주세요.)

[X,Y]=pol2cart(THETA,R);
// pol2cart함수를 써서, polar coordinate 좌표계인 THETA,R 데이터를 X,Y의 cartesian coordinate로 변환해 주었습니다.
//  THETA,R은 위의 meshgrid를 이용해서 행렬로 표현했으므로,
//  X,Y도 바로 3d graph를 그릴 수 있는 행렬 형식으로 변환되었습니다.
//  단 이때 pol2cart 함수는 반드시 pol2cart(각도, 거리) 순서로 함수가 입력되어야 합나디.

surf(X,Y,z);   ( 혹은 mesh(X,Y,z); )

// surf나 mesh함수를 써서 데이터를 표현합니다. 

이건 제가 쓴 코드 전문입니다. 

>> r=[0:10:100];
>> th=[0:45:360].*pi/180;
>> [R,TH]=meshgrid(r,th);
>> [X,Y]=pol2cart(TH,R);
>> z=[304.5  304.6  304.6  304.5  304.4  303.9  303.8  302.4  302.7  303.0  304.9
304.5  303.0  302.9  303.0  302.6  302.3  301.5  301.4  302.5  303.1  303.9
304.5  304.6 303.8 304.2 303.5 303.3 302.6 302.2 302.3 303.4 305.5
304.5  305.5 304.5 305.1 304.9 304.3 303.5 303.1 303.6 303.9 304.9
304.5  304.3 304.4 304.2 304.1 304 304 303.4 303.6 304 305.9
304.5  303 303.3 303.5 302.9 302.8 302.4 302.7 301.8 302.3 303.3
304.5  304.3  303.9  303.7  303.5  303.2  302.8  302.2  303.1  303.6  305.6
304.5  304.3  303.9  303.7  303.5  303.2  302.8  302.2  303.1  303.6  305.6
304.5  304.6  304.6  304.5  304.4  303.9  303.8  302.4  302.7  303.0  304.9
];
>> surf(X,Y,z)


결과는 요렇게 됩니다::