2013-03-19 3 views
6

좌표계의 네 구석에 점이 있는지 확인해야하는 JS 프로그램에서 작업하고 있습니다.2D 점이 사변형 안에 있는지 확인하십시오.

누군가 나를 대답의 방향으로 가리킬 수 있습니까?

저는 볼록 사변형이라고 불리는 것을보고 있습니다. 즉, 모든 각도가 180 °보다 작은 4 개의 무작위로 선택된 모서리 위치입니다.

감사합니다.

+0

나는 여기에서 사용 된 inpolygon 메톤을 시도했다 [link] (http://stackoverflow.com/questions/5922027/how-to-determine-if-a-point-is-within-a-quadrilateral?rq=1) ,하지만 작동하지 않습니다. 그것은 나에게 "정의되지 않은"inpolygon 메서드를 호출 할 수 없다. 'if (Math.inpolygon (5,6, [1,22,13,1], [1,1,21,31])) { return "yep"; } ' – Henrik

+0

왜 좌표를 비교할 수 없습니까? 문제를 더 자세히 설명 할 수 있습니까? 포인트 란 무엇입니까? 모서리? – 4pie0

+0

나는 꽤 무작위로 생성 된 사변형의 톤이 있습니다. 그런 다음 일부 (또한 무작위로 생성 된) 지점이 "사용 가능"하거나 이미 사변형으로 점령되었는지 확인해야합니다. – Henrik

답변

9

비교적 간단한 두 가지 방법이 있습니다. 첫 번째 방법은 점에서 광선을 "무한대"(실제로는 다각형 외부의 모든 점)로 그려서 광선이 교차하는 다각형의면을 몇 개인 지 계산하는 것입니다. 카운트가 홀수 인 경우에만 포인트가 다각형 내부에 있습니다.

번째 방법은하기와 정점의 각 쌍에 대한 다각형 주위 V 가고있다 I 및 V I + 1, 금액 (계산 (필요한 경우 제 정점 감싸) X - X I) * (Y I + 1 - Y I) - (X + 1 I - X I) * (Y - Y I ). 이 수량들이 모두 같은 부호를 가지면 포인트는 다각형 안에 있습니다. (이 양은 벡터의 교차 곱의 Z 성분이다 (v i + 1 - v i) 그리고 (p - v i) 모두 동일한 부호를 갖는다는 조건은 다음과 같다. p가 모든 가장자리의 같은 쪽 (왼쪽 또는 오른쪽)에있는 조건.

두 가지 접근법은 점이 모서리 나 꼭지점에 정확하게있는 경우를 처리해야합니다. 먼저 다각형 안에 있는지 여부를 계산할지 여부를 결정해야합니다. 그런 다음 그에 맞게 테스트를 조정해야합니다. 사소한 수치 반올림 오류는 잘못된 대답을 줄 수 있음을 유의하십시오. 그것은 당신이 함께 살아야 할 것입니다.

볼록 사변형이 있으므로 다른 접근 방법이 있습니다. 임의의 3 개의 꼭지점을 선택하고 세 개의 선택된 꼭지점에 의해 형성된 삼각형에 대해 점 및 네 번째 꼭지점의 barycentric coordinates을 계산합니다. 점의 중심 좌표가 모두 양수이고 4 번째 꼭지점의 중심 좌표보다 작 으면 점은 사변형 내부에 있습니다.

P. 꽤 많은 전략을 나열한 멋진 페이지 here을 발견했습니다. 그들 중 일부는 매우 흥미 롭습니다.

+0

많은 (불필요한) 계산이 필요없이 첫 번째 접근 방식과 같이 광선을 그리는 방법을 알지 못합니다. 그러나 두 번째 방법과 함께 작동하도록 할 것입니다. 감사! – Henrik

+0

@Henrik - 네 개의 꼭지점의 최대 X 좌표보다 더 멀리있는 점을 X 축에서 선택하십시오. 그러면 광선은 테스트 포인트에서 X 축의 점으로 이동할 수 있습니다. (물론 Y 축은 똑같이 잘 사용할 수 있습니다.) 선이 아닌 _segments_ 선의 교차점을 테스트해야한다는 것을 기억하십시오. –

+0

@Henrik - 두 번째 방법을 사용하는 경우 공식에 오타가 있음을 알고 있어야합니다. 이제 수정되었습니다. (나는 몇 자리에서 i 대신 첨자로 0을 사용했다.) –

0

와인딩 또는 광선 추적 방법을 사용해야합니다.

와인딩을 사용하면 선분으로 만들어진 모든 모양 안에 점이 있는지 확인할 수 있습니다.

기본적으로 각 선분의 외형을 점으로 취한 다음 모든 결과를 더합니다. 그것은 별이 별자리에 있는지를 결정하기 위해 행한 방법입니다. 나는 다른 방법이 있다는 것을 볼 수 있습니다 ..

http://en.wikipedia.org/wiki/Point_in_polygon

몇 곳이 몇 가지 코드가 있어야합니다.

0

포인트가 삼각형 내에 있으면보기가 훨씬 쉽습니다.

임의의 사변형은 두 개의 삼각형으로 나눌 수 있습니다.

포인트가 사변형을 구성하는 두 개의 삼각형 중 하나에 있으면 포인트는 사변형 내부에 있습니다.

관련 문제