Generate random points inside a circle with radius R





  이번 포스팅은 매트랩을 이용해 반지름이 R인 임의의 원을 생성하고 그 내부에 임의의 점(point)을 생성하는 방법에 대해 소개하겠습니다. 

 

 내용 및 과정 자체는 매우 심플하여 어렵지 않으나 이러한 구현은 다양한 연구분야에서 시스템 환경으로 활용됩니다. 실제로 제가 연구하고 있는 cognitive radio 시스템이나 localization에서 시뮬레이션을 위해 사용하고 있으며 이 외에 다른 여러 분야에서도 응용가능합니다. 



그림 1. 반지름이 10인 원



 그림 1과 같이 반지름(radius, r)이 10인 원을 먼저 그려보도록 하겠습니다. 일단 원을 그리기 위해선 기본적으로 원의 중점과 반지름을 설정해야 합니다. 


%% 원 그리기 

x1 = 0;  % 원 중심의 x좌표

y1 = 0;  % 원 중심의 y좌표

rc = 10; % 원의 반지름

[x,y] = cylinder(rc,200);  % z축의 파라미터를 입력할 경우 3차원의 원통형이 생성되지만 여기서는
                               % 2차원의 원만 표기하기 위해 z축 파라미터는 사용하지 않습니다. 

                               % 총 200개의 요소로 이루어진 원의 바운더리 좌표가 x, y에 각각 저장

figure(1)

plot(x(1,:)+x1, y(1,:)+y1, 'b', 'LineWidth', 2), hold on, grid on;

%앞에서 설정한 원의 중심값을 각 x, y좌표에 더해줌으로써 (x1,y1)을 중점으로 하는 반지름 10인 원을 그려주게 됩니다.'

title(['\fontsize{15}Radius=',num2str(rc)]);

xlabel('[m]'), ylabel('[m]');

코드 1. 반지름이 rc인 원 생성하기


위 코드대로 입력하시면 그림 1과 동일한 원을 그리실 수 있습니다. 

그러면 이제 그 원 안에 임의의 점(point)를 생성해보도록 하겠습니다. 



먼저 해당 코드를 짜기 전에 간단하게 어떤 방식으로 임의의 점을 생성시킬지 생각해봅시다.


1) 원의 중심을 기준으로 가장 멀리 떨어진 점의 거리(길이)를 반지름 이하가 되도록 한다. 

  -> rc값 이하의 임의의 숫자를 생성( r = rc*sqrt(rand) )

2) 원의 중심을 기준으로 임의의 라디안을 생성한다.

  -> gen_rad = 2*pi*rand;

3) 1)과 2)에서 생성한 값을 이용해 원의 중점(x1, y1)으로부터 임의의 위치에 point를 생성한다.

  -> x = r*cos(a)+x1, y = r*sin(a)+y1;


그러면 위에서 설명하 내용을 바탕으로 코딩을 진행해보도록 하죠. 


%% 반지름이 rc인 원 생성

x1 = 0;  % 원 중심의 x좌표

y1 = 0;  % 원 중심의 y좌표

rc = 10; % 원의 반지름

[x,y] = cylinder(rc,200);  % z축의 파라미터를 입력할 경우 3차원의 원통형이 생성되지만 여기서는 
                               % 2차원의 원만 표기하기 위해 z축 파라미터는 사용하지 않습니다. 

                               % 총 200개의 요소로 이루어진 원의 바운더리 좌표가 x, y에 각각 저장

figure(1)

plot(x(1,:)+x1, y(1,:)+y1, 'b', 'LineWidth', 2), hold on, grid on;

%앞에서 설정한 원의 중심값을 각 x, y좌표에 더해줌으로써 (x1,y1)을 중점으로 하는 반지름 10인 원을 그려주게 됩니다.'

title(['\fontsize{15}Radius=',num2str(rc)]);

xlabel('[m]'), ylabel('[m]');

%% 임의의 점 생성

a = 2*pi*rand( 1, length(x) );

r = sqrt( rand( 1, length(x) ) );

x11 = rc.*r.*cos(a) + x1;

y11 = rc.*r.*sin(a) + y1;

plot(x11, y11, '.r')

코드 2. 반지름이 rc인 원 생성 후 내부에 임의의 점 생성 


코드 2와 같이 코드 1의 뒤에 해당 부분을 추가해주면 모든 코딩이 끝나고 그림 2와 같이 나타나게 됩니다.


그림 2. 반지름이 rc인 원 내부에 임의의 포인트 생성


 

 또한 여기서 생성하는 임의의 포인트 숫자를 줄이거나 늘릴 수 있는데요, 코드 2부분에서 변수 ar의 길이를 생성할때 length(x)로 정의 했기 때문에 코드 1에서 생성한 원 바운더리의 포인트 갯수 (201개)와 동일하게 생성했습니다. 따라서, 임의의 점 개수를 늘리고 싶으시다면 해당 부분의 숫자를 조절해주시면 됩니다. 

 

다음번 포스팅은 위 예제를 이용한 푸아송 점 과정(Poisson point process) 예제를 진행해보도록 할게요 : )

+ Recent posts