【发布时间】:2015-06-03 09:14:02
【问题描述】:
我正在尝试确定一个点是否位于多边形内部。我使用来自this website 的以下(针对 Swift 修改的)算法:
func contains(polygon: [Point], test: Point) -> Bool {
let count = polygon.count
var i: Int, j: Int
var contains = false
for (i = 0, j = count - 1; i < count; j = i++) {
if ( ((polygon[i].y >= test.y) != (polygon[j].y >= test.y)) &&
(test.x <= (polygon[j].x - polygon[i].x) * (test.y - polygon[i].y) /
(polygon[j].y - polygon[i].y) + polygon[i].x) ) {
contains = !contains;
}
}
return contains;
}
但是,当有一个具有以下坐标的简单多边形时:(x: 0, y: 40), (x: 0, y: 0), (x: 20, y: 0), (x: 20, y: 20), (x: 40, y: 20), (x: 40, y: 40),并检查点(x: 30, y: 20),结果为真,因为当i 和j 为true 时,结果为真5 和 4((x: 40, y: 40) 和 (x: 40, y: 20)),尽管该点仅位于多边形的边界。如果该点确实位于在多边形中,该函数实际上应该只评估true。感谢您对算法的任何帮助或改进/调整!
【问题讨论】:
-
虽然您描述的问题确实存在,但您对测试用例的描述看起来并不现实。
if语句中的条件不会在点(30, 20)和边(40, 20)-(40, 40)上计算为true。((polygon[i].y >= test.y) != (polygon[j].y >= test.y))部分已经是false。(20 >= 20) != (40 >= 20)是false。 -
没有答案。这就是所谓的退化。浮点运算只是如此准确,因此实际上存在模糊边界,点可能位于多边形内部或外部,这取决于您编写测试的方式,即使所有方法在数学上都是正确的。跨度>