이번엔 간단히 원을 어떻게 그릴 수 있는지에 대해서 설명한다.
Wave 1)
먼저 아래와 같은 원의 방정식이 있다.
$$(x - x_c)^2+(y - y_c)^2 = r^2$$
이는 x-y plane에서의 중심이 ($x_c$, $y_c$)이고 반지름이 $r$인 원이다. 이를 x 그리고 y로 정리하면 다음과 같다.
$$x = x_c \pm \sqrt{r^2-(y-y_c)^2}$$
$$y = y_c \pm \sqrt{r^2-(x-x_c)^2}$$
이를 가지고 Matlab을 이용하여 원을 그리기 위한 코드를 Line-by-Line으로 작성해본다.
먼저 원하는 원의 중심 그리고 반지름을 다음과 같이 선언한다.
다음으로 x축의 데이터를 생성을해야하는데, 위 식에서 $\pm$부분이 걸린다. 한번에 x축의 데이터를 저장할 수 없을 것 같으니 다음과 같이 선언해보자
| dp = 0.01; x_p = ((x_c - r):dp:(x_c + r))'; % y_p를 위해 x_c-r ~ x_c+r를 0.01간격으로 데이터 생성 x_n = ((x_c - r):dp:(x_c + r))'; % y_n을 위해 x_c-r ~ x_c+r를 0.01간격으로 데이터 생성 y_p = y_c + sqrt(r^2 - (x_p-x_c).^2); y_n = y_c - sqrt(r^2 - (x_n-x_c).^2); circle_pt = [x_p, y_p; x_n, y_n]; % 원을 이루는 x,y position을 하나의 배열로 통합 | cs |
circle_pt 행렬 변수로 원의 x, y position 정보를 하나의 배열로 통합하였다.그러면 이를 간단히 plotting을 해보는 코드 작성은 다음과 같다.
| figure; plot(x_c,y_c,'r.','MarkerSize',20);%원의 중심점 찍자 hold on; grid on; %다음 그림이랑 겹쳐그릴 거고 grid를 생성해주자 xlim([x_c-r x_c+r]); %plot x 축 표현 범위 설정 ylim([y_c-r y_c+r]); %plot y 축 표현 범위 설정 title('Draw Circle') xlabel('X-pos[m]'); %이왕이면 plot x 축 설명도 ylabel('Y-pos[m]'); %이왕이면 plot y 축 설명도 %Line 으로 그리기 plot(circle_pt(:,1),circle_pt(:,2),'b-','LineWidth',2); %점으로 찍어서 그리기 plot(circle_pt(:,1),circle_pt(:,2),'k.','MarkerSize',20); | cs |
결과 plot은 다음과 같다.
잘 그려진 것 같다.
하지만 Line(파란색)으로 그려진게 x축으로 일직선으로 그려졌고, dot(검은색)으로 그려진것은 뭔가 x축 양쪽에 허전 한 부분이 생긴다.... 이건 변수 dp를 더 줄여도 이런현상이 생긴다.
( 직접 해보세요 (ว˙∇˙)ง ).
다른 방법이 필요할 것 같다.
Wave 2)
다른 식을 사용해서 그려보자 Wave 1은 뭔가 찝찝했다.
이번엔 다음 식을 통해 그리는 것을 도전해보자
$$x = x_c+rcos\theta$$
$$y = y_c+rsin\theta$$
작성한 부분에서 수식 부분 이외에 별 다르게 바뀐건 없을것이라 생각이 들어야한다.
| r = 5; x_c = 5; y_c = 5; angle = (0:0.1:2*pi)'; x1 = (x_c + r*cos(angle)); y1= (y_c + r*sin(angle)); circle_pt = [x1, y1]; | cs |
그렇다면 이를 이전것과 동일한 방식으로 plot 해보자
| figure; plot(x_c ,y_c,'r.','MarkerSize',20); hold on; grid on; title('Draw Circle'); xlabel('X-pos[m]'); %이왕이면 plot x 축 설명도 ylabel('Y-pos[m]'); %이왕이면 plot y 축 설명도 xlim([x_c-r x_c+r]); %plot x 축 표현 범위 설정 ylim([y_c-r y_c+r]); %plot y 축 표현 범위 설정 %Line 으로 그리기 plot(circle_pt(:,1),circle_pt(:,2),'b-','LineWidth',2); %점으로 찍어서 그리기 plot(circle_pt(:,1),circle_pt(:,2),'k.','MarkerSize',20); | cs |
결과 그림은 다음과 같다.
너무 잘 그려져서 뿌듯하다(*˘◡˘*)~.
Wave 3) 조금 더 가지고 놀아보면 원하는 각도 위치에서 1바퀴 도는 코드를 작성해보자
전체적으로 코드는 동일하고 plot을 어떻게 해줄지에 대한 요령을 다음 코드를 통해 습득해보자,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | clear all; close all; clc; deg2rad = pi/180; r = 5; x_c = 5; y_c = 5; angle = (45:5:45+(360*1))'*deg2rad;% 저는 deg가 좋아요 x1 = (x_c + r*cos(angle)); y1= (y_c + r*sin(angle)); circle_pt = [x1, y1]; figure; plot(x_c ,y_c,'r.','MarkerSize',10); hold on; grid on; title('Draw Circle'); xlabel('X-pos[m]'); %이왕이면 plot x 축 설명도 ylabel('Y-pos[m]'); %이왕이면 plot y 축 설명도 xlim([x_c-r x_c+r]); %plot x 축 표현 범위 설정 ylim([y_c-r y_c+r]); %plot y 축 표현 범위 설정 plot(circle_pt(1,1),circle_pt(1,2),'b.','MarkerSize',20); for i=2:1:length(circle_pt)-1 plot(circle_pt(i,1),circle_pt(i,2),'k.','MarkerSize',5); drawnow(); pause(0.1); end plot(circle_pt(length(circle_pt),1),circle_pt(length(circle_pt),2),'r.','MarkerSize',20); | cs |
결과는 다음 영상과 같다.
Wave 3까지 작성했는데 "단순히 원을 그린다"가 아니라 이를 위해 어떻게 Data를 저장해야하는지, 이 때 배열을 사용했는데 왜 배열을 사용하였는지(그냥 사용하기 편해서 사용하긴함), 왜 그렇게 배열을 구성했는지, Line으로 그리고 Dot으로 따로 보여준 것인지, 마지막 영상에서는 왜 점을 하나씩 찍으면서 원을 그렸는지 한번쯤은 고민? 추리? 해줬으면 한다.
Comments
Post a Comment