다각형 내에 지점을 확인하는 방법

논문은 포인트를 사용할 필요가

자기 참조 

https://solos.im/2015/3/27/%E6%80%8E%E6%A0%B7%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA %의 E7의 % 82 % B9의 %의 E5의 % 9C % A8의 %의 E5의 %의 A4의 %의 9A %의 E8 %로 % B9의 %의 E5의 % BD %의 A2 %의 E5의 % 86 % 85 /

 

출발지

최근 현기증, 갑자기이 문제는 우리가이 시점에 따라 행정 구역을 계산할 수 있습니다 해결, 다음 판사가 좌표 시점 이후 다각형 내에있는 방법을 연구하려는 점의 좌표.

연산

다음과 같이 매우 영리한 알고리즘 인터넷에서 조금 찾을 발견, 알고리즘은 다음과 같습니다

  • 전체 표면은 두 부분으로 나누어진다 (x> 0 && Y == 0 || Y> 0 섹션 X <0 && Y == 0 || Y <0 부)
  • 순차 주사 폴리곤 정점과 다른 부분에 선행 정점 (교차 곱으로 결정) 시계 방향 또는 반 시계 방향의 방향에 대해 원점에 이전 점은,이 시계 방향인지 결정할 각 꼭지점 R ++, 또는 R - (처음에 R 0)
  • r에 == 2 || R ==의 결과 경우 - 2, 다각형의 내부는 달리, 원점에 없습니다.

파이썬 달성

DEF is_point_in (X는 Y가 가리키는) 
    카운트 = 0 
    , X1, Y1 = 점 [ 0 ] 
    x1_part = (Y1> Y) 또는 ((X1 - x> 0 ) 및 (Y1의 ==의 Y)) # X1에在哪一部分을中
    X2, Y2 = ' , '   # 포인트 [ 1 ] 
    points.append ((X1, Y1)) 
    에 대한 포인트  포인트 [ 1 :] 
        X2, Y2 = 포인트 
        x2_part = (Y2> Y) 또는 ((X2 > X)과 (Y2의 ==의 Y)) # 2 배在哪一部分中
         경우 x2_part == x1_part : 
            X1, Y1= X2, Y2는
             계속 
        MUL = (X1이 - X) * (Y2 - Y) - (X2 - X) * (Y1 - Y)
         의 경우 MUL> 0 : #叉积大于0逆时针
            카운트 + = 1 
        ELIF MUL < 0 : 
            카운트 = - 1 
        X1, Y1 = X2, Y2 
        x1_part = x2_part
     경우 카운트 == 2 또는 == 수 - 2 :
         리턴 다른 :
         리턴 거짓 


경우 __name__ ==' __main__ ' : 
    포인트 = [ 117.1510864068032 , 40.0705150448258는 , [ 117.2866776871509 , 40.10934259697606가 , ...] 
    , Y가 = 39.99 
    X = 116.468006을 
    위해 xrange ( 10000 ) 
        is_point_in (X + I *는 0.01 (Y) + I *는 0.01 ) 포인트

상영 시간
시간 파이썬 point.py 

실제 0m8.746s의 
사용자 0m8.680s 
에 sys 0m0.034s을

10,000 번 수행, 너무로 이동하려고,이 나무를 느리게 8.746 초 정도 걸립니다

 

기본 패키지 

수입 ( 
    // "FMT" 
) 


FUNC is_point_in (X float64는 Y float64은 [] [] float64 포인트) BOOL { 
    카운트 : = 0 
    , X1, Y1 : = 포인트 [ 0 ] [ 0 ], 포인트 [ 0 ] 1 ] 
    x1_part : = (Y1> Y) || ((X1 - x> 0 ) && (Y1의 ==의 Y))
     VAR의 A = [] float64 {X1, Y1} 
    : P = APPEND (점 A)
     에 대한 I = P 레인지 {
         경우 (I == 0 ) {
             계속
        } 
        점 : = P [I] 
        X2, Y2 : = 포인트 [ 0 ], 포인트 [ 1 ] 
        x2_part : = (Y2> Y) || ((X2> X) && (Y2의 ==의 Y))
         의 경우 (x2_part == x1_part) { 
            X1, Y1 = X2, Y2가
             계속 
        } 
        MUL : = (X1 - X) * (Y2 - Y) - (X2 - X ) * (Y1 - Y)
         경우 MUL는> 0 { 
            카운트 + = 1 
        } 다른 {
             경우 (MUL < 0 ) {
                카운트 - = 1 
            } 
        } 
        X1, Y1 = X2, Y2 
        x1_part = x2_part 
    } 

    경우 (계산 == 2 == || 카운트 - 2 ) {
         반환  진정한 
    } 다른 {
         반환  거짓 
    } 
} 

FUNC 주 () { 
    점 : = [] float64 {{ 117.1510864068032 , 40.0705150448258 }, { 117.2866776871509 , 40.10934259697606 }, ...}, 
    Y : =39.99 
    X : = 116.468006 
    위한 I = 1 ; 난 < 10000 ; 난 ++ { 
        _ = is_point_in (X + float64 (I) * 0.01 , Y + float64 (I) * 0.01 포인트) 
    } 
}

실행 시간 :

point.go 구축 갈 
시간. / 포인트 

실제 0m0.038s 
사용자 0m0.035s 
SYS 0m0.005s을

 

 

추천

출처www.cnblogs.com/clemente/p/11260214.html