我们有一组标记点,其凸包不重叠。凸壳之间有一些空的空间。
鉴于未标记的点不在我们的数据中,我们想要近似确定它所在的凸包。
为了使计算速度更快,我们希望减少凸包上的边数(从而稍微扩展凸包,但不要太多)。
我可以使用哪些算法?
更新:理想情况下,我想在不与给定的附近多边形相交的约束下进行扩展。 (这种约束的动机是我有几个不相交的船体,并希望减少所有这些船体的侧面数量,同时仍然保持它们不相交。但是将其视为括号,因为我不想进行联合修改。我是很高兴修改一个船体,同时保持其他船体不变。我很乐意破解这个简单的案例,反复进行联合修改。)
答案 0 :(得分:2)
也许这值得尝试。 找到 A union x 的凸包 A ',以及 B的凸包 B ' union x 。 选择最小的船体面积增加。 在下面的示例中, A '是赢家。
<小时/> 添加以回应评论: 一条路线是通过“最小封闭 k -gons”:
然而,这些算法非常复杂,不太可能有用。
答案 1 :(得分:2)
凸多边形中的&#34;点#34;测试不是那么昂贵,因为它可以通过二分法在Lg(N)
比较中执行(用直线将多边形分成两部分,递归直到你剩下一个三角形)。 N
是边数。实际上,27个(相应的130)边的多边形将花费你三角形的两倍(三倍)。
如果你有很多船体,那么对每一个船体进行详尽的比较都是一种浪费。有一些更好的方法,例如使用单调细分,在预处理之后,可以将搜索时间减少到总共M
个边的O(Log(M))查询时间。
答案 2 :(得分:1)
如果通过增加的充气船体的假阳性率增加超过粗略阶段中的一个边缘处理的节省,则我不会感到惊讶。实际上,你甚至可以让更多为自己工作 - 无论如何,每一个通过粗略阶段检查的点都必须与真正的船体进行核对。
我没有尝试减少n
包含检查中的O(n)
,而是想直接采取摊销O(1)
的粗略通行证:
可以提前计算网格的状态:
可以改变网格的分辨率,以便在存储器成本(每个四位2位)和误报率(低分辨率网格将导致更多O(n)
传统的船体检查)之间进行权衡。
答案 3 :(得分:1)
看起来你的最终目标并不是关于凸包,而是关于解决点位置问题(https://en.wikipedia.org/wiki/Point_location)。而且你似乎决定通过简单地反复检查你的点与许多凸包来解决它。虽然我理解凸壳的来源(它们实际上代表了点集),但它仍然不是在算法中直接使用它们的理由。点位置问题可以通过许多更有效的算法(如基于梯形分解的搜索树)来解决,这些算法对船体边缘的数量要小得多。