怎樣判斷乙個點在多邊形內

2022-02-05 21:08:01 字數 2127 閱讀 7883

畢業**需要用到的乙個點

參考自 

最近頭腦發熱,突然想研究下怎麼判斷乙個座標點是否在乙個多邊形內,這個問題解決之後就可以根據乙個座標點計算出這個點所在的行政區劃。

從網上找了一下,發現了乙個很巧妙的演算法,演算法如下:

def is_point_in(x, y, points):

count = 0

x1, y1 = points[0

] x1_part = (y1 > y) or ((x1 - x > 0) and (y1 ==y)) # x1在哪一部分中

x2, y2 = '', '' # points[1

]

for point in points[1

:]: x2, y2 =point

x2_part = (y2 > y) or ((x2 > x) and (y2 ==y)) # x2在哪一部分中

if x2_part ==x1_part:

x1, y1 =x2, y2

continue

mul = (x1 - x)*(y2 - y) - (x2 - x)*(y1 -y)

if mul > 0

: # 叉積大於0 逆時針

count += 1

elif mul

< 0

: count -= 1

x1, y1 =x2, y2

x1_part =x2_part

if count == 2 or count == -2

:

return

true

else

:

return

false

if __name__ == '

__main__':

points = [[117.1510864068032,40.0705150448258],[117.2866776871509,40.10934259697606

], ... ]

y = 39.99

x = 116.468006

for i in xrange(10000

): is_point_in(x + i * 0.01, y + i * 0.01, points)

執行時間

time python point.py

real 0m8.746s

user 0m8.680s

sys 0m0.034s

執行了10,000次,耗時8.746秒,太慢了有木有, 改成go試試

package main

import (

//"fmt"

)func is_point_in(x float64, y float64, points float64)

bool

for i :=range p

point :=p[i]

x2, y2 := point[0], point[1

] x2_part := (y2 > y) || ((x2 > x) && (y2 ==y))

if (x2_part ==x1_part)

mul := (x1 - x)*(y2 - y) - (x2 - x)*(y1 -y)

if mul > 0

else

}x1, y1 =x2, y2

x1_part =x2_part

}if (count == 2 || count == -2

) else

}func main() ,, ... ,}

y := 39.99

x := 116.468006

for i:=1; i < 10000; i++

}

go build point.go

time ./point

real 0m0.038s

user 0m0.035s

sys 0m0.005s

多邊形問題( 判斷乙個點在不在多邊形內)

試題一 災區已經非常困難,災民需要帳篷 衣物 食品和血漿。可通往災區的道路到處都是塌方,70 以上的路面損壞,橋梁全部被毀。中國空軍立即啟動應急預案,展開史上最大強度非作戰空運行動,準備向災區空投急需物資。由於餘震不斷,天氣惡劣,怎樣知道空投的物資是否落在某災區的區域內呢?經過空中觀測,某災區為一凸...

點在多邊形內的判斷

凸多邊形考慮叉積,因為在凸多邊形中,我們假設圍繞多邊形走一圈,如果點在多邊形內,那麼這個點一直在我們的同一側。按照這個性質,我們順時針或者逆時針處理多邊形上的點,叉積運算,算參考的和多邊形上連續的兩個點,如何叉積的結果符號發生變化,那麼不再多邊形內。double det point p1,point...

判斷點在多邊形內演算法

點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段,好像不適...