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차원의 원통형이 생성되지만 여기서는 % 총 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; |
그러면 위에서 설명하 내용을 바탕으로 코딩을 진행해보도록 하죠.
%% 임의의 점 생성 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부분에서 변수 a와 r의 길이를 생성할때 length(x)로 정의 했기 때문에 코드 1에서 생성한 원 바운더리의 포인트 갯수 (201개)와 동일하게 생성했습니다. 따라서, 임의의 점 개수를 늘리고 싶으시다면 해당 부분의 숫자를 조절해주시면 됩니다.
다음번 포스팅은 위 예제를 이용한 푸아송 점 과정(Poisson point process) 예제를 진행해보도록 할게요 : )
'Engineering > MATLAB' 카테고리의 다른 글
#5. 매트랩 subplot EPS 포맷 이용시 여백 사이즈 조절 (0) | 2020.04.05 |
---|---|
#4. 무작위로 행렬 원소 섞기 (0) | 2018.10.12 |
#3. 매트랩 CVX 다운로드 및 설치 (1) | 2018.10.08 |
#1. Matlab을 이용한 간단한 Signal 의 Convolution 구현 (2) | 2013.02.12 |