MATLAB

MATLAB으로 WanderCircle 함수 제작하기

Jiyoung1026 2025. 5. 19. 08:43

안녕하세요~!

오늘은 MATLAB을 활용해서 WanderCircle이라는 함수를 만들어보겠습니다!!


말로 하는 것보다 눈으로 보는 것이 더 정확하겠죠??

일단 WanderCircle 함수를 보여드리겠습니다~~!!

 

 

WanderCircle 함수가 실행되게 하려면

명령창에 WanderCircle(원의 개수, 원의 크기)를 입력하면 됩니다!

명령창에 이런 식으로 작성하면

WanderCircle(100, 4)

 

이런 식으로 100개의 원이 4의 선굵기로 나타납니다.

 

하나의 예시를 더 보여드리자면

WanderCircle(200,2)

 

 

이런 식으로 200개의 원이 2의 선굵기로 나타납니다.


 

이 코드의 특징

명령창에 'help WanderCircle'라고 작성하면 알 수 있습니다.

그 내용을 정리해보자면

 

입력이 WanderCircle(n, t)로 주어질 때,

1. n개의 원

2. t의 선 굵기

3. 각 원의 반지름1~5 사이의 정숫값으로 랜덤 하게 지정

4. 모든 원은 이전 원과 접함

5. 색상 랜덤

이라는 점을 알 수 있습니다.

 

그리고 이 함수의 사용법

1. WanderCircle(n, t) => n과 t는 주어진 값

2. WanderCircle(n) => n은 주어진 값, t는 2

3. WanderCircle => n은 100, t는 2

이렇게 3가지로 사용할 수 있습니다!


 

자 이제 본격적으로 코드를 분석해 봐야겠지요!

이게 전체 코드입니다!!

function hello(n, t)
    if nargin < 1
        n = 100;
        t = 2;
    end
    if nargin < 2
        t = 2;
    end

    x = 0;
    y = 0;
    r = randi([1, 5]);

    figure;
    axis equal;
    hold on;
    axis off;

    theta = linspace(0, 2*pi, 100);
    plot(r * cos(theta) + x, r * sin(theta) + y, ...
         'LineWidth', t, 'Color', rand(1,3));

    prev_x = x;
    prev_y = y;
    prev_r = r;

    for i = 2:n
        r = randi([1, 5]); 
        angle = 2 * pi * rand(); 
        dx = (prev_r + r) * cos(angle);
        dy = (prev_r + r) * sin(angle);
        x = prev_x + dx;
        y = prev_y + dy;

        plot(r * cos(theta) + x, r * sin(theta) + y, ...
             'LineWidth', t, 'Color', rand(1,3));

        prev_x = x;
        prev_y = y;
        prev_r = r;
    end

    hold off;
end

 

한줄한줄 설명해 드리도록 하겠습니다!


1. 함수 정의하기

function WanderCircle(n, t)

 

n개의 원을 t의 굵기로 설정하는 함수를 정의합니다!


2. 입력값 기본 설정하기

if nargin < 1
    n = 100;
    t = 2;
end
if nargin < 2
    t = 2;
end

 

만약 입력인수가 1보다 작으면 입력 인수가 없는 WanderCircle이 형태겠지요??

그럴 때에는 n은 100, t는 2로 설정한다는 코드입니다.

 

그리고 만약 입력인수가 2보다 작으면 WanderCircle(n)이 형태로 사용되었다는 의미이고,

그럴 때에는 t를 2로 설정한다는 코드입니다!

 


3. 첫 원의 중심과 반지름 설정

x = 0;
y = 0;
r = randi([1, 5]);

 

첫 원의 중심(0,0)으로 설정하고, 반지름1과 5 사이에서 랜덤값으로 설정하는 코드입니다!

 

첫 원의 중심을 (0,0)으로 설정하는 이유는

기준점으로 가장 단순한 위치기도 하고,

이후에 그려지는 원들을 그리기 위해 상대적으로 계산이 간단해지기 때문입니다!

 

< randi에 대한 설명 >

https://kr.mathworks.com/help/matlab/ref/double.randi.html

 

randi - Uniformly distributed random integers - MATLAB

This MATLAB function returns a random scalar integer between 1 and imax.

kr.mathworks.com

 


4. 그림 그리기 전 준비

figure;
axis equal;
hold on;
axis off;

 

axis equal

x축과 y축 비율을 똑같이 유지하도록 하는 코드

axis off

축의 눈금을 제거하는 코드

hold on

여러 개의 원이 그려질 때마다 한 그래프에 계속 그리는 코드


5. 극좌표를 생성하고, 첫 번째 원 그리기

theta = linspace(0, 2*pi, 100);
plot(r * cos(theta) + x, r * sin(theta) + y, ...
     'LineWidth', t, 'Color', rand(1,3));

 

첫 번째 줄은 극좌표를 생성하는 줄인데, 극좌표를 생성하는 이유원을 정확하고 매끄럽게 그리기 위해서입니다!

0부터 2π까지 100등분을 해서 theta를 설정해줍니다!

 

자 이제 첫 번째 원을 그려줍니다.

plot는 2차원 그래프를 그려주는 함수입니다.

< plot에 대한 설명 >

https://kr.mathworks.com/help/matlab/ref/plot.html

 

plot - 2-D line plot - MATLAB

This MATLAB function creates a 2-D line plot of the data in Y versus the corresponding values in X.

kr.mathworks.com

 

근데 여기서 의문이 생길 수 있습니다.

위에서 첫 번째 원의 중심과 반지름을 설정했는데, 왜 또 설정해야 하지??

 

중심과 반지름만 설정해서는 원이 보이지 않기 때문에
시각적으로 "그리는" 과정이 따로 필요하기 때문입니다.

 

자 이제 궁금증도 해결했겠다~ 다시 코드 분석으로 돌아가보겠습니다!

위에서 theta에 원을 그리기 위한 점을 모두 만들어두었으니, 첫 번째 원을 그려보겠습니다.

반지름이 r이고 (0,0) 일 때의 원의 좌표는

x = r cos(θ), y = r sin(θ) 입니다.

하지만 우리는 중심이 (x, y)인 점을 그리고 싶으니

x = r cos(θ) + x, y = r sin(θ) + y

x방향으로 x만큼 평행이동하고, y방향으로 y만큼 평행이동 해줍니다.

그리고 plot (r * cos(theta) + x, r * sin(theta) + y)하면 원이 완성됩니다!

 

뒤에 있는 'LineWidth', t, 'Color', rand(1,3)

'LineWidth', t => 선 굵기는 t

'Color', rand(1,3) => 색깔은 RGB 값 중 랜덤

을 의미합니다!

 


6. 이전 원의 정보 저장

prev_x = x;
prev_y = y;
prev_r = r;

 

다음 원의 위치를 계산할 때 사용하기 위해서 저장합니다.

 


7. 반복문으로 원 반복해서 그리기

for i = 2:n

 

2번째 원부터 n번째 원까지 반복하는 반복문 시작합니다.

 

r = randi([1, 5]);

 

새로운 원에 적용할 반지름을 설정합니다.

 

angle = 2 * pi * rand();

 

랜덤으로 방향을 생성하는데, 다음 원이 어디 붙을지를 결정하는 코드입니다.

 

이제 원이 접하게 하기 위한 핵심적인 코드를 살펴보겠습니다!

dx = (prev_r + r) * cos(angle);
dy = (prev_r + r) * sin(angle);
x = prev_x + dx;
y = prev_y + dy;

 

효과적인 이해를 위해서 그림으로 표현해보겠습니당!

 

 

이렇게 계산하면 접하는 원의 중심좌표를 구할 수 있게 됩니다!

만약 이해가 되지 않으시다면 댓글 남겨주세용~~!!

 

자 이제 이 좌표를 중심으로 새로운 원을 그립니다.

plot(r * cos(theta) + x, r * sin(theta) + y, ...
     'LineWidth', t, 'Color', rand(1,3));

 

위에서와 마찬가지로 중심을 설정해 주고,

굵기는 t, 색깔은 RGB값 중 랜덤 하게 설정해서 원을 그립니다.

 


8. 이전 원의 정보 저장

prev_x = x;
prev_y = y;
prev_r = r;

 

다음 원을 또 그리기 위해서 저장합니다.

여기서 또 궁금증이 생길 수 있는데요!

이전 원의 정보를 왜 2번이나 저장할까~~?

 

첫 번째 저장은 for 반복문에 들어가기 전에 첫 번째 원을 기준으로 사용하기 위해,

그리고 두 번째 저장은 다음 원을 위해 기준 정보를 업데이트하기 위해 사용합니다!!

 

궁금증이 해결되셨기를 바라요!


9. 반복문을 종료하고 마무리

    end
    hold off;
end

 

반복문을 종료하고, 마무리합니다.

hold에 대해서는 하이퍼 링크를 걸어두겠습니다!

< plot에 대한 설명 >

https://kr.mathworks.com/help/matlab/ref/hold.html

 

hold - Retain current plot when adding new plots - MATLAB

This MATLAB function sets the axes hold state to on, which retains plots in the current axes so that new plots added to the axes do not delete existing plots.

kr.mathworks.com

 

휴~ 드디어 모든 코드 설명이 끝났네요!!!

마지막으로 파일 올려드리고 끝내도록 할게요.

 

WanderCircle.m
0.00MB

 

블로그 읽어주셔서 너무 감사드려요!

저희 함께 모두 열심히 공부해서 다 같이 MATLAB 고수가 되어보아용!!!

그럼 즐거운 MATLAB 공부하세요!