본문 바로가기

Enginius/Matlab

Check Point in Polygon (inpolygon)

 어떤 (x,y) 좌표계에서 point가 주어진 polygon 속에 있는지 확인하고 싶을 경우가 있다. 이런 경우에 유용하게 사용될 수 있는 함수가 inpolygon 함수이다. 이 함수는 기본적으로 네 개의 인자를 받는다. 앞의 두 개는 확인하고자 하는 (x,y)좌표이고, 뒤의 두 좌표는 polygon의 경계를 나타낸다. 


 다음과 같은 예제를 통해서 간단히 알아볼 수 있다. 

% 내부를 확인할 boundary를 설정한다. 

nr_edge       = 4;

rand_boundary = 10*rand(nr_edge, 2);

rand_boundary = [rand_boundary ; rand_boundary(1, :)];  % 마지막 모서리를 closed되게 한다. 


% 전체 point의 수 

nr_point      = 100;

rand_pos      = 10*rand(nr_point, 2);


% 전체 point에 대해서 검사를 한다. 

idx = inpolygon( rand_pos(:, 1), rand_pos(:, 2) ...

    , rand_boundary(:, 1)'  ...

    , rand_boundary(:, 2)' ); 

inside_idx  = idx;

outside_idx = ~idx;


% 그 결과를 plot 한다. 

hold on;

h1 = plot( rand_boundary(:, 1), rand_boundary(:, 2), 'b-');

h2 = plot( rand_pos(inside_idx, 1), rand_pos(inside_idx, 2), 'r+' );

h3 = plot( rand_pos(outside_idx, 1), rand_pos(outside_idx, 2), 'go');

legend([h1 h2 h3], 'Boundary', 'Points inside', 'Points outside');

hold off;