1. 程式人生 > >scala 實現:判斷點是否在多邊形內的演算法

scala 實現:判斷點是否在多邊形內的演算法

判斷點是否在多邊形內的演算法

在這裡呢主要用到的是射線法,具體的介紹請看這篇介紹,講得非常詳細

首先我們可以自己簡單定義一個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則表示點在多邊形外

缺點:

  1. 計算前要先對二維點集資料進行順時針或逆時針排序
  2. 對於要判斷的點在多邊形的邊上的特殊情況無法做出準確的判斷,對於這種情況可以先判斷點是否在某條邊上(即((p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x) = p.x),然後單獨做處理。

參考資料