논문은 포인트를 사용할 필요가
자기 참조
출발지
최근 현기증, 갑자기이 문제는 우리가이 시점에 따라 행정 구역을 계산할 수 있습니다 해결, 다음 판사가 좌표 시점 이후 다각형 내에있는 방법을 연구하려는 점의 좌표.
연산
다음과 같이 매우 영리한 알고리즘 인터넷에서 조금 찾을 발견, 알고리즘은 다음과 같습니다
- 전체 표면은 두 부분으로 나누어진다 (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을