오늘은 간단하게 MATLAB 을 사용하여 원을 그리는 방법에 대해 소개하려 합니다.

 

아래 포스팅에서도 소개한 적이 있지만~ 아래 포스팅에서는 ezplot 를 사용하여 그래프를 그렸었는데~


2011/03/13 - [programming language/MATLAB] - MATLAB ezplot() 함수로 그래프를 쉽게 그리자

 

오늘은 수치적인 방법으로 그래프를 그려 보도록 하죠~

 

원이나 다각형 그래프들은 단순한 그래프라 조그만 생각해 보고 코딩하면 되겠지만

 

MATLAB File Exchange 에 보니 괜찮은 코드가 있어서 소개 하려 합니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/2876-draw-a-circle

 

위 주소에서 아래 그림과 같이 코드를 다운로드 받습니다.

 

다운로드 받은 circle.zip 파일을 풀어보면~ circle.m 파일이 있는데요~

 

circle.m 파일은 함수 입니다. 함수 원형은 다음과 같더군요.

 

H=CIRCLE(CENTER,RADIUS,NOP,STYLE)

 

위 함수에서 CENTER 는 원의 중심을 의미하고, RADIUS 는 반지름, NOP 는 Number of Point 를 원을 그리고자 하는 점의 개수, STYLE 은 그릴 선의 스타일을 말합니다.

 

위 함수에서 저는 좀더 그래프가 정확하게 보이게 하기 위해 맨 뒤에 다음과 같은 코드 한 줄을 추가해서 사용합니다.

 

function H=circle(center,radius,NOP,style)

%---------------------------------------------------------------------------------------------

% H=CIRCLE(CENTER,RADIUS,NOP,STYLE)

% This routine draws a circle with center defined as

% a vector CENTER, radius as a scaler RADIS. NOP is

% the number of points on the circle. As to STYLE,

% use it the same way as you use the rountine PLOT.

% Since the handle of the object is returned, you

% use routine SET to get the best result.

%

% Usage Examples,

%

% circle([1,3],3,1000,':');

 

% circle([2,4],2,1000,'--');

%

% Zhenhai Wang <zhenhai@ieee.org>

% Version 1.00

% December, 2002

%---------------------------------------------------------------------------------------------

 

if (nargin <3),

error('Please see help for INPUT DATA.');

elseif (nargin==3)

style='b-';

end;

THETA=linspace(0,2*pi,NOP);

RHO=ones(1,NOP)*radius;

[X,Y] = pol2cart(THETA,RHO);

X=X+center(1);

Y=Y+center(2);

H=plot(X,Y,style);

axis square;

axis equal; 

다운로드 받은 Circle() 함수를 사용하여 간단하게 원을 한번 그려 볼까요?

 

중점이 10,5 지점에 반지름 3,2,1 인 원 세 개를 그리는 예제 입니다.

 

circle([10,5],3,1000,'r');

hold on

circle([10,5],2,1000,'b--');

hold on

circle([10,5],1,1000,'g:');

 

다음과 같이 그래프가 나오죠.

 

 

circle.m파일을 열어서 코드를 확인해 보시면~ circle() 함수를 사용하면 정다각형도 그릴 수 있다는 것을 알 수 있을 겁니다.

 

간단하게 삼각형, 오각형, 팔각형 하나씩 그려보죠~

 

circle([10,5],3,4,'r');

hold on

circle([10,5],2,6,'b--');

hold on

circle([10,5],1,9,'g:');

 

위 코드를 보시면 유추해 볼 수 있겠지만~

 

그리고자 하는 다각형의 꼭지점의 수보다 1 만큼 크게 NOP 값을 설정해 주면 됩니다. 그래서 삼각형을 그릴 때 4 라는 수를 설정해 준겁니다.

 

위 코드를 돌려 보면 다음과 같이 삼각형, 오각형, 팔각형 그래프가 나옵니다.

 

결과적으로 Circle 함수를 사용하여 원을 그리는 것은 정다각형의 꼭지점의 개수(NOP)를 상대적으로 크게 늘려서 그리는 것이라는 것을 확인 할 수 있습니다.

 

다각형(polygon) 에 대한 정의는 아래 주소 참조바랍니다.

 

http://terms.naver.com/entry.nhn?docId=1078892&cid=40942&categoryId=32224



  1. 2016.04.15 11:19

    비밀댓글입니다

    • 남성 2016.04.15 12:04 신고

      다운로드 받은 Circle 함수를 사용하는거죠. Circle 함수 내에 써주는게 아닙니다. Circle 함수를 다운로드 받고 압축을 해제한 후에 MATLAB workspace 를 Circle 파일을 들어 있는 함수로 이동 한 다음에 위 코드를 실행해 보세요.

    • 2016.04.21 13:38

      circle 파일을 들어있는 함수로 이동한 다음에 실행을 어떻게 하는거죠...?

      circle.m이라는 파일이 projects1 라는 폴더에 있어요!

    • 남성 2016.04.21 13:41 신고

      해당폴더로 이동후에 위에적은 코드를실행하는거죠. 함수 실행 방법에 대해 공부를 해야 할 것 같네요

    • 2016.04.21 16:05

      비밀댓글입니다

    • 남성 2016.04.21 16:53 신고

      네 다행이네요.

  2. 2016.05.11 09:45

    비밀댓글입니다

    • 2016.05.11 09:46

      비밀댓글입니다

    • 남성 2016.05.11 12:07 신고

      네 맞습니다. 꼭지점이 많으니까 원처럼 보이는거죠. 원이란게 사실 꼭지점이 무한대인 다각형이라고 생각할 수도 있는거니까요.

  3. 2016.10.10 23:41

    비밀댓글입니다

    • 남성 2016.10.11 23:25 신고

      사각형이 원이 디면 inpoligon 이 유지는 안 될것 같은데요.

C/C++ 코딩시 매크로는 #define 을 사용하여 다음과 같이 정의하곤 합니다.

 

단순하게 상수등을 다음과 같이 정의하곤 하지만~

 

#define PI     (3.141592)

 

상수 뿐만이 아니라 매개변수등도 이용할 수가 있습니다.

 

사용법은 굉장히 단순한데요.

 

다음과 같이 원의 넓이를 구하는 매크로를 구성할 수 있습니다.

 

#define CIRCLE(x) ((x)*(x)*(PI))

 

매크로 정의시에는 항상 모든 부분들을 괄호를 이용하여 꼼꼼하게~ 묶어 주는 게 좋습니다. 그렇지 않으면~~ 까딱 잘못하다가 예상치 못한 결과를 얻을 수 있거덩여~

 

다음으로 # 연산자를 간단하게 소개하겠습니다.

 

이미 많은 분들이 아시겠지만, # 연산자는 매개변수를 문자화 하는 연산자 입니다.

 

다음과 같이 사용합니다.

 

#define STRING(x) #x

 

위와 같이 define 을 하고 STRING(Character) 하면~ " Character" 라고 문자열로 정의한것과 마찬가지 입니다.

 

이제 마지막으로 ## 연산자에 대해 소개해 드리죠~

 

아래와 같이 정의하고~

#define X(n) x##n

 

X(1) 이라고 하면~ 이는 변수 x1 을 입력한 것과 동일합니다. 즉. ## 연산자는 토큰들을 결합하는 역할을 하는거죠.

 

x1, x2, x3 …. 등과 같이 정의하고 싶다면~ ## 연산자를 이용해서 처리 할 수 있겠죠~

 

위 설명한 부분에 대해 간단하게 예제를 만들어 보았습니다.

 

#include <iostream>

 

using namespace std;

 

 

#define PI     (3.141592)

 

#define CIRCLE(x) ((x)*(x)*(PI))

#define STRING(x) #x

 

#define INT_X(n) int x##n = n

#define COUT_X(n) cout << "x"#n" = " << x##n <<endl

 

 

int main()

{

// 원의 넓이

cout << "반지름 4인 원의 넓이 : " << CIRCLE(4) << endl ;

 

// 매크로 # 연산자

cout << "# 연산자 예 : " << STRING(문자열로~) << endl ;

 

// 매크로 ## 연산자

 

INT_X(0);

INT_X(1);

INT_X(2);

INT_X(3);

 

COUT_X(0);

COUT_X(1);

COUT_X(2);

COUT_X(3);

 

 

return 0;

}

 

위 코드를 실행 시켜 보면 다음과 같은 결과가 나타납니다.


#, ## 연산자를 이용한 매크로는 디버그시 특히 유용하다 하더군요~ 


아래 주소에서 macro 에 대한 좋은 예들을 볼 수 있다.  

http://www.cprogramming.com/tutorial/cpreprocessor.html



+ Recent posts