복사http://jmpabu.blog.me/70069397777


프로그래밍에 있어서는 기하는

사실적으로 쉬운 부분이다.

그러나 대부분(?)의 인간들은 기하에 대한 문제를

어렵게 생각한다. 물론 나도 마찬가지이다.

기하는 여러 경우로 나눠서 생각해보아야 하기 때문이다.

그러면 우선적으로 기본부터 알고가자.

 

========== 다각현의 면적 ===========

수올을 한다면 대부분은 알고있을 것이다.

다각형의 각 꼭지점의 좌표가 시계방향순으로 했을경우에

(x1,y1), (x2,y2), ... , (xn,yn)이라 하자. (-> n각형)

(혹은 반시계방향도 괜찮다. 또, 삼각형일때는 순서는 상간없다.)

면적 S는 다음과 같이 구한다.

이를 흔히 사선식이라 부른다.

증명은 알아서 해보길 바란다.

 

====== 시계 및 반시계 방향 확인 ======

어느 세 점, (x1,y1), (x2,y2) (x3,y3), 이 있다하자.

이때 이 세 점을 순서대로 이어서 선을 그을 때 이 선이

시계방향으로 돌아가는가, 반시계방향으로 돌아가는가를 아는 것 이다.

 

위의 사선식을 이용하면 쉬게 구할 수 있다.

S = 1/2 |x| 라 해보자. (이 경우에서는 n=3일 때이다.)

i) x<0 ; 이는 시계방향을 의미이다.

ii) x=0; 이는 일직선 상에 세 점이 놓여있음을 의미한다.

iii) x>0; 이는 반시계방향을 의미한다.

증명은 역시 알아서 해보길 바란다.

 

========= 선분 교차 =========

선분교차의 여부에 관한것은 내가 이 블로그에 올려놨으니 그 설명으로도 충분히 이해가 가길 바란다.

 

=========== 점의 위치 ==========

어떤 점 (x0,y0) 이 있다 해보자.

그리도 n각형의 도형 (x1,y1) ~ (xn,yn)있다 하자. (n≥3)

그럴때 (x0,y0)이 위의 도형안에 있는지,

도형 위에 있는지, 또 도형 밖에 있는지를 판별 해 보려고 한다.

 

점이 도형위에 있는지를 판별하는것은 문제가 되지 않는다.

임의의 한 변과 주어진 점으로 사선식을 돌렸을때 0이 나와야하며

점의 좌표범위가 (xi,yi), (x(i+1),y(i+1))의 내부에 위치하기만 한다면

선분위에 그 좌표가 있는셈이다. (물론 방법은 조금 달라도 된다.)

 

그럼 나머지의 경우를 알아보자.

방법은 간단하다.

(x0,y0)에서 오른쪽으로 직선을 그어보자. ((x0,y0) - (∞,y0) 연결)

그 선분과 도형과의 교점갯수를 세어봤을때

짝수이면 점은 도형 바깥에 위치하는 것이며

홀수이면 점은 도형 안쪽에 위치하게 되는 셈이다.

 

셀 때에는 그저 각 선분마다 그 반직선과 만나면 갯수를 증가시켜주면 된다.

그러나 교점을 셀 때에는 어떤 경우는 세어야 하며

어떠한 경우는 세지 말아야 하는 경우가 생기게 된다.

다음 그림을 봐보자.

 

1,3번과 같은 경우는 만나지 않은것으로,

2,4번과 같은 경우는 1번 만난것으로 체크를 해 쥐야 한다.

그러므로

위와같은 경우에서 첫줄일 경우에만 한번 체크해 주면 되겠다.

반응형

+ Recent posts