문제

어떤 방법으로는 가장 빠른 결정의 여부를 포인트 내부에 평행 사변형/형?

도움이 되었습니까?

해결책

안녕하세요, 여러분의 모든 답변에 감사드립니다. 그 동안 나는 나 자신이 다소 빠를 것이라고 생각하는 것을 생각해 냈습니다.

PQ와 PR이 벡터 (P, Q 및 R은 모서리) 인 PQ와 PR에 의해 퍼져있는 평행 사변형이 있다고 상상해보십시오. 또한 A라는 점을 확인하고 싶은 점이 있습니다.

벡터 PA는 PQ 및 PR에 평행 한 두 벡터로 분할 될 수 있음을 알고 있습니다.

PA=n*PQ+m*PR

이제 우리는 n과 m이 간격이어야한다는 것을 알고 있습니다 [0; 1], 우리는 n과 m을 해결합니다 :

n = -det(PA, PQ)/det(PQ, PR)
m = det(PA, PR)/det(PQ, PR)

여기서 DET (PA, PQ)는 벡터 PA 및 PQ의 결정 요인입니다.

det(PA, PQ) = PA.x*PQ.y-PQ.x*PA.y

점 a가 평행 사변형 내부에 있으면 0 <= n <= 1 및 0 <= m <= 1이면 의사 코드를 제공합니다.

var d:Number = det(PQ, PR);
if (0 <= -det(PA, PQ)/d <= 1 && 0 <= det(PA, PR)/d <= 1)
{
    //inside
}
else
{
    //outside
}

다른 팁

상상 엑스레이에서 나오는 요점에서 하나의 방향이다.는 경우에 레이 십자가의 형태의 홀수 시간,그것은 모양 안쪽에 있습니다.는 경우 그것은 십자가도 몇 번,그것은 외부 모양입니다.

그래서 당신의 프로그램을 만들이 보이지 않는 라인을 참조하십시오 얼마나 자주 그것은 십자가.Actionscript 아마도 내장되어 기능을 이렇게 하려면 내가 상상할 것 이다.

지금,당신의 톤을 개 지점에서 할 수있다,당신은 작업 속도를 높일 수 있습니다 사용 바이너리 파티션 공간 의 위치를 저장하는 개체.그런 식으로,당신은 없을 비교하는 관점과 매체,그냥 사람이 있습니다.

나의 답변 이 질문, 는 매우 비슷합니다.거기에,나는 무엇을 생각은 아주 쉽게에서 테스트한 경우는 평행 사변형에는 모서리 (0,0) 기 때문에 그것은 쉽게 설명해 보이지만,그것은 매우 열심히 그것을 수정하는 작업에서 일반적입니다.

편집:이 질문에 소유자에 익숙한 벡터,나는 기본적으로 다시 작성 내에 응답하는 언어입니다.가정하자 평행 사변형은 벡터에 의해 스팬 PQPR, 디 P, Q, 고 R 는 코너입니다.기호 * 나타내는 것이다 dot 제품입니다.선택점 qPQ 수직 Pq (i.e Pq*PQ=0 고) PR*Pq>0 (예를 들어,당신이 얻을 수 q 회전에 의해 Q 주변 P 90 도).또한 선택점 rPR*Pr=0PQ*Pr>0.그런 다음 포인트 A 가 내부에는 경우에만 (0 < Pr*PA < Pr*PQ) && (0 < Pq*PA < Pq*PR).

이것 종이 광선과 사변형이 어디에서 교차하는지 결정하는 방법을 설명합니다. 사변형이 평행 사변형 인 경우 더 단순화 할 수 있습니다.

벡터가 설명하는 인접한 측면이있는 평행 사변형이있는 경우 AB 그리고 AC. 평행 사변형 평면의 모든 지점은 다음 벡터로 설명 할 수 있습니다.

T(a, b) = A + a * AB + b * AC

모든 광선은 원점으로 설명 될 수 있습니다 영형 그리고 방향

R(t) = O + t * D

2의 교차점은 언제입니다 T(a, b) == R(t)

O + t * D = A + a * AB + b * AC

이것을 해결하십시오 a 그리고 b 그리고 그것들이 0과 1 사이인지 확인하십시오.이를 구현하는 방법은 용지 끝의 의사 코드를 참조하십시오.

라인의 표준 방정식은 AX+BX+C = 0으로 제공됩니다. 그러나 흥미롭게도, 해당 표현식 AX+BX+C를 취하고 특정 라인의 A, B, C가 주어진 지점 X, Y를 평가하면, 표현식은 평면을 두 개의 반쪽으로 분할한다는 것을 알게 될 것입니다. 절반은 표현이 0보다 크고 나머지 절반은 적습니다.

이제 평행 사변형의 4 점을 가져 와서 평행 사변형의 측면을 구성하는 각 라인에 대한 A, B, C 계수를 계산하면 해당 X, Y의 각 표현식을 평가하고 어느 쪽을 평가할 수 있는지 확인할 수 있습니다. 그 지점이 켜져 있습니다. 그만큼 내부에 평행 사변형은 논리적이고 특정 측면이 될 것입니다.

즉, 네 줄 각각에 대해 A, B, C가 있으면 테스트를 수행 할 수 있습니다. 무엇 처럼

if ( ((a1*x+b1*y+c1)>0) && ((a2*x+b2*y+c2)<0) && 
        ((a3*x+b3*y+c3)<0) && ((a4*x+b4*y+c4)>0) {
    // it's in!
}

.. 유일한 나머지 트릭은 각 부호 테스트의 '극성'을 결정해야한다는 것입니다. 이 작업을 수행하는 쉬운 방법은 0,0을 평가하고 원하는쪽에 있는지 확인하는 것입니다. 이는 'C'의 부호가 테스트 할 방법을 알려줍니다.

틀림없이, 그것은 일종의 무자비한 힘의 방법이지만, 볼록한 다각형을 위해 작동하도록 확장 될 수 있습니다.

나의 첫 번째 관찰에 대해 이 문제는 직사각형(정렬 축)간단한 타락한 경우이다.는 경우 두 모서리의 직사각형습니다:(x1,y1)과(x2,y2)그럼 당신은 단순히 당신 테스트 포인트를 주어(x3,y3),는 분(x1,x2) < x3 < max(x1,x2)및 min(y1y2) < y3 < max(y1,y3).

이 될 수도 있습니다 유용한 최적화입니다.우리가 발견하는 경우 축 정렬되어 경계 직사각형의 우리의 평행 사변형 그런 다음 우리가 시작할 수 있는 빠른 테스트의 특정 지점입니다.

우리의 경우,패러랠 가 non-zero 경사면 그 다음 우리는 계산 축의 교차점은 우리의 경계선 라인의 교차점을 통과하는 지점을 통해서 질문에 사람들었습니다.두 경우의 우리의 지점의 교차점(에 의해 정의된 모두 슬로프)사이에있는 우리의 교차점을 우리는 경계선 그런 다음 우리는습니다.는 경우 하나의 이웃 사람들의 범위는 다음을 우리가 아닙니다.

난 시간이 없어 코드를 하지만 컴퓨팅 이러한 슬로와 교차점은 첫 해에 대해 자세히 알아보십시오.

[부 칙]

나는 지금 보는 첫 번째 포스트(에 대한 엑스레이에서 포인트를 테스트하고 확장에 따라 모든 임의의 기울기)을 참조하여 일반적인 이러한 문제에 대한 해결책을 모든 폐쇄 평면 다각형...또는,사실에 대한 어떠한 폐쇄형 곡선입니다.그것은을 확장할 수 있습니다 세 가지 차원으로 닫히 표면이 있습니다.

그러나,하나의 경고하는 것을 적용하여 평행 사변형거나 rhomboids.의 경우 오목한 다각형(또는 다른 곡선)는 경우 선박 apex(corner)그런 다음이 가능 테스트 반도의 번호를"라인"횡단.에 다른 단어의 어떤 부분에는"곡선"는 동시에 포함되는 여러 개의"양쪽의"다각형을 반환할 수 있는 거짓이 긍정적이다.

두 가지 솔루션이 될 것이다:명시적으로 테스트해 교차로에 선 세그먼트 limits(모퉁이/정점)또는 치료의 각 선 세그먼트에 묶여 한쪽 끝에(포 엡실론)(도록 우리의 계산을 찾을 수 없이 어떤 시점에서 일반 사이의 두 가지 측면).

내 생각의 경계 직사각형은 여전히 유용한 빠른 테스트와 확장지 않은 일반적으로 모든 다각형으로 구성됩니다.우리가 찾 min()및 max()x 을 찾 왼쪽과 오른쪽 경계면 그리고 분()고 및 max()y 을 찾기 위해 아래와 최고 경계.이것은 또한 확장할 수 있는 세 가지 차원...과 친구가 저에게 말하는 표준이 그래픽 라이브러리를 사용하여 광범위하게 이에 대한 충돌 검출에서 대부분의 그리고 가상 현실 Mmorpg 게임,등등.면 찾을 충돌에서 경계 상자 그들은 더 세분화된 계산에는 다각형은 거기에 포함.

평행 사변형이 볼록한 경우 (그리고 평행 사변형의 정의가 주어지면 XD이어야 함), 경계에 있는지 여부를 테스트하는 모든 알고리즘은 4 개의 정점이 있다는 것을 알기 때문에 루프를 끊는 효율성을 향상시킬 수 있습니다. .

다음은 벡터 제품의 오른쪽 규칙을 기반으로 모든 세그먼트의 동일한 측면에있는 점을 테스트하는 간단한 알고리즘입니다 (간단한 부호 테스트로 벡터를 정상화하기 위해 디비전을 교체하여 최적화 할 수 있습니다).

2D 정수 좌표에서 포인트가 볼록한 다각형 내부에 있는지 테스트하는 방법은 무엇입니까?

또 다른 옵션, 동일한 평행 사변형에 대한 많은 비교를 수행하려는 경우 사각형으로 정상화하고 변환을 수행하는 매트릭스를 얻고 테스트 할 때마다 매트릭스를 곱한 다음 점검하는 것입니다. 변환 된 지점이 정규화 된 정사각형 내부에있는 경우 (훨씬 쉬워야 함).

  1. 다각형의 윤곽을 얻으십시오
  2. 포인트가 Countour에 있는지 확인하십시오

dist1 = cv2.pointPolygonTest(contours[0], (50, 70), True)

Dist는 다음 세 가지 중 하나를 반환합니다.

  • 포인트가 윤곽 안에있는 경우 양수
  • 포인트가 윤곽 외부에있는 경우 음의 값
  • 포인트가 윤곽에있는 경우 0입니다

컨투어 내부에 포인트가 있는지 확인하는 방법은 무엇입니까?

Y 좌표가 가장 간단하므로 시작하십시오. 포인트의 y 좌표가 모양의 상단과 하단 사이에 있으면 x 좌표로 이동하십시오. 포인트의 Y 좌표에서 모양의 왼쪽 및 오른쪽의 X 좌표를 계산하고 점의 X 좌표가 그들 사이에 있는지 확인하십시오.

편집하다:

상단 왼쪽 상단, 오른쪽 상단, 오른쪽 하단 및 하단 코너의 4 개의 좌표가 주어지면 :

if (y >= y1 && y <= y3) {
   var k = (x4 - x1) / (y4 - y1);
   var m = x1 - k * y1;
   if (x >= k * y + m) {
     k = (x3 - x2) / (y3 - y2);
     m = x2 - k * y2;
     if (x <= k * y + m) {
       // inside
     }
   }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top