判断点是否在多边形内的算法
在这里呢主要用到的是射线法,具体的介绍请看这篇介绍,讲得非常详细
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则表示点在多边形外
缺点:
- 计算前要先对二维点集数据进行顺时针或逆时针排序
- 对于要判断的点在多边形的边上的特殊情况无法做出准确的判断,对于这种情况可以先判断点是否在某条边上(即
((p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x) = p.x
),然后单独做处理。
参考资料
http://www.html-js.com/article/1517