2012-09-27 3 views
1

많은 수의 볼록 쿼드 (4 개의 주어진 x, y 포인트)를 가장 효율적인 방법으로 array/list를 실행 한 다음 해당 쿼드의 테두리 내에 또는 그 포인트가있는 경우 해당 쿼드를 확인합니다.포인트가 볼록 쿼드 다각형 안에 있는지 또는 가장 위에 있는지 확인하는 가장 효율적인 방법

원래 레이 캐스팅을 사용해 보았지만 모든 폴리곤이 쿼드이고 모두 볼록하다는 것을 알고 있기 때문에 약간의 과잉이라고 생각했습니다.

현재 각 쿼드를 가장자리를 공유하는 두 개의 삼각형으로 분할 한 다음 해당 영역을 사용하는 두 개의 삼각형 각각이 켜져 있는지 확인합니다. 예 삼각형 ABC 및 테스트 포인트에 대한 P.

경우 (areaPAB areaPAC + + areaPBC == areaABC) {TRUE를 반환; }

체크를 실행하기 위해 4 개의 다른 삼각형의 면적을 계산해야하므로 쿼드의 첫 번째 삼각형이 false를 반환하는 경우 조금 더 느리게 실행될 수 있습니다.이 경우 4 개의 더 많은 영역을 가져야합니다. (나는 부동 소수점 오류를 보완하기 위해 수표에 약간의 엡실론을 포함시킨다)

쿼드에 대해 한 번에 한 번씩 점검하는 것이 더 빠른 방법이되기를 바라고있다. 두 개의 삼각형으로

다각형을 배열 [,]에 넣어 검사 수를 줄이려고했습니다. 다각형을 추가 할 때 최소 및 최대 x 및 y 값을 확인한 다음이를 사용하여 동일한 폴리를 올바른 배열 위치에 배치합니다. 사용 가능한 다각형에 대해 점을 검사하면 배열 목록에서 적절한 목록을 검색합니다.

나는 비슷한 질문을 통해 검색해 왔으며 지금 내가 사용하고있는 것은 포인트가 삼각형인지 알아내는 가장 빠른 방법 일 수 있다고 생각하지만 더 좋은 테스트 방법이 있다고 기대한다. 항상 볼록한 쿼드입니다. 내가 다 봤던 모든 다각형 테스트는 여러면을 가지고 있거나 불규칙한 모양의 다각형에 대해 테스트하는 것 같습니다.

시간이 오래 걸리는 질문을 읽어서 간단한 문제에 대해 감사드립니다.

답변

1

나는 가장 빠른 방법이라고 생각 :

1 : 외적 징후를 통해 모든 벡터 쌍 (DirectedEdge-CheckedPoint)의 상호 방향을 찾을 수 있습니다. 네 개의 부호가 동일하다면, 포인트

추 내부 : 점 P가 i 번째의 비교적 좌측 반 평면에 놓여 있다면 모든 에지

EV[i] = V[i+1] - V[i], where V[] - vertices in order 
PV[i] = P - V[i] 
Cross[i] = CrossProduct(EV[i], PV[i]) = EV[i].X * PV[i].Y - EV[i].Y * PV[i].X 

십자가 [I] 값이 양수 에지 (V [i] - V [i + 1])이고, 그렇지 않으면 네거티브이다. 모든 Cross [] 값이 양수이면 점 p가 quad 내부에 있고 정점은 시계 반대 방향입니다. f 모든 십자 [] 값이 음수이면 점 p가 쿼드 안에 있고 정점은 시계 방향입니다. 값의 부호가 다른 경우 점은 쿼드 외부에 있습니다. 쿼드 세트가 많은 포인트 쿼리 같으면

dmuir 모든 에지 균일 광고 방정식을 미리 계산하기 위해 제시한다. 균일 선 방정식은 a * x + b * y + c = 0입니다. (a, b)는 모서리에 수직 인 벡터입니다. 이 수식에는 중요한 속성이 있습니다. 표현식 기호 (a * P.(교차 상품의 경우)

2 : 쿼드를 2로 삼각형으로 나누고 각각에 대해 벡터 방법을 사용합니다. CheckedPoint 벡터를 베이시스 벡터로 표현합니다. A가,> = 0, 그 합 (B) = 1 <

두 방법 10-15 가산, 승산 6-10 및 2-7의 비교가 필요할 때

P = a*V1+b*V2 

포인트 I하지 않음 (내부에 부동 소수점 오차 보정 고려)

+0

제안 해 주셔서 감사합니다. 나는 두 번째 방법을 시도했지만 현재 사용하고있는 방법보다 계산량이 적지 만 간신히 계산합니다. 첫 번째 방법을 좀 더 설명 할 수 있기를 바랬는데 더 나은 결과를 얻을 수없는지를보기 위해 dmuir에서 언급 한 모서리 방정식을 저장하는 것과 함께 사용할 수 있습니다. – Steve

+0

원래 게시물의 설명을 보내 주셔서 감사합니다. 귀하의 수식을 적용했는데 다른 방법보다 빠르게 실행되고있는 것 같지만 문제가 발생했습니다. 포인트가 내부에있는 것이 아니라 가장자리에 놓여있는 경우에도 수표가 반환되어야합니다. 어딘가에서 엡실론을 사용하여 조정할 수있는 방법이 있습니까? 현재 구현 된 방법은 다음과 같습니다. – Steve

+0

나는 항상 폴리곤에서 4 점을 가지므로 [i] 대신에 수동으로 선언하고 4 개의 EV와 PV를 채우고 십자가 결과에 대한 수레를 사용하여 똑같이합니다. 그렇다면 모든 4 개의 교차 결과가 모두> 0 또는 <0인지 확인합니다. 0과 비교하여 작은 숫자로 체크를 변경하는 것이 효과가있는 것 같지만 이것이 잘못된 방법인지 궁금합니다. . 도와 주셔서 다시 한 번 감사드립니다! – Steve

1

각 쿼드를 사용하여 각 에지의 방정식을 저장할 수 있다면 MBo의 해답에 약간의 시간을 절약 할 수 있습니다.

예를 들어 쿼드의 각 모서리에 대해 내향 방향 법선 벡터 N이 있고 상수 d (모서리에있는 점 p 중 하나에 대해 Np)가있는 경우 점 x는 각 에지에 대해 Nx> = d 인 경우에만. 따라서 2 곱셈, 가장자리 당 하나의 덧셈과 하나의 비교가 있습니다. 포인트 당 최대 4 개의 테스트를 수행해야합니다.이 기법은 모든 볼록한 다각형에 적용됩니다.

+0

또한이 테스트는 선 자체에있는 점이 다각형 내에 등록되도록 허용합니까? 테스트 포인트를 확인하기 전에 각 가장자리에 저장해야 할 작업을 정리해주십시오. – Steve