- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道用于查找点是否在任何多边形内部的标准光线转换算法。但是,如果您仅限于凸多边形,是否有更快的方法?
最佳答案
是的,您可以使用二进制搜索。您可以通过递归地将多边形切割为其大小的一小部分(即一半)并检查您在哪一侧来执行此操作。例如,您可以首先检查您是在通过顶点 0 和顶点 n/2 的直线的正侧还是负侧。一旦你有 3 个顶点,你只需测试剩下的两条边,完成与那个三角形的测试。
这里有一些伪代码,希望能使这更容易理解:
function TestConvexPolygon(point, polygon)
if polygon.size == 3 then
return TestTriangle(point, polygon) // constant time
if (TestLine(point, polygon[0], polygon[polygon.size/2]) > 0)
return TestConvexPolygon(point, new polygon from polygon.size/2 to polygon.size-1 and 0)
else
return TestConvexPolygon(point, new polygon from 0 to polygon.size/2)
另一种可视化方法是,您可以将多边形视为三角形扇形。然后,您首先测试您的点与中值内部边缘。这将从扇形中消除一半可能的三角形。由于半个三角形扇仍然是三角形扇,您可以递归地执行此操作,直到您的扇中只剩下一个三角形,然后您可以显式测试它。
真正的实现需要一些索引处理,但在其他方面很简单且健壮。
关于algorithm - 如何快速判断一个点是否在二维凸多边形内 N 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095114/
下面的问题是二维的,所以建议答案时可以做一些简化。 我需要从一组点/线段创建封闭区域(由线段或仅由一组点定义 - 凸多边形)。 基本上我使用 Voronoi 生成“道路”。然后我更改了一些数据。现在我
我有一个由点和三角形组成的凸多面体(三角形的法线在多边形之外): 输入结构为: class Vector { float X, Y, Z; }; class Triangle { int po
我有一个用点表示的凸多边形。点由x 坐标数组 和y 坐标数组 表示。 例如: X = {6, 1, 5, 0, 3} Y = {4, 0, 0, 4, 6} 如何按顺时针排序这些点?点数并不总是相同,
我是一名优秀的程序员,十分优秀!