scala 实现:判断点是否在多边形内的算法

判断点是否在多边形内的算法

在这里呢主要用到的是射线法,具体的介绍请看这篇介绍,讲得非常详细

http://www.html-js.com/article/1517

首先我们可以自己简单定义一个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),然后单独做处理。

参考资料

http://www.html-js.com/article/1517

猜你喜欢

转载自blog.csdn.net/k_wzzc/article/details/82779291