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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值