scala 實現:判斷點是否在多邊形內的演算法
阿新 • • 發佈:2018-12-15
判斷點是否在多邊形內的演算法
在這裡呢主要用到的是射線法,具體的介紹請看這篇介紹,講得非常詳細
首先我們可以自己簡單定義一個Point類
case class Point(var x:Double ,var y:Double) {
def getPoint = Point.apply(x,y)
}
下面是實現過程
/** * 判斷點是否在多邊形內部 */ def isInPloyin(p: Point, pts: List[Point]) = { var intersectionp = 0 for (i <- 0 until pts.size) { val p1 = pts(i) val p2 = pts((i + 1) % pts.size) if (p.y >= min(p1.y, p2.y) && p.y < max(p1.y, p2.y)) if (((p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x) < p.x) intersectionp += 1 } intersectionp % 2 }
返回值是0,則表示點在多邊形內,1則表示點在多邊形外
缺點:
- 計算前要先對二維點集資料進行順時針或逆時針排序
- 對於要判斷的點在多邊形的邊上的特殊情況無法做出準確的判斷,對於這種情況可以先判斷點是否在某條邊上(即
((p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x) = p.x
),然後單獨做處理。
參考資料