我目前正在研究一个问题,我需要在3D空间中正确排序(使用类似右手规则)的节点。到目前为止,我的想法是构造一个转换矩阵,将节点转换为x-y平面,然后使用Graham扫描。我需要确保用户只输入凸多边形,所以如果我找到任何“内部”节点,我知道多边形是凹的,可能会抛出错误。除了检查凸度之外,Graham扫描的排序过程还会为我订购节点。
我对优化的几何算法并不十分熟悉。这看起来像是一个合适/有效的过程吗?或者有更好的方法:
1)按一些规则(例如RH规则)和多边形的顺序排列多边形的节点 2)确保平面多边形(可能不在x-y平面中)是凸的?
答案 0 :(得分:1)
是的,这是一个非常好的解决方案。以下是如何实现它以忽略数字不准确性。
- take any 3 points; these determine the plane, rotate appropriately
- check that abs(z)<THRESHOLD for all z-coordinates, now you can ignore them
- perform Graham scan which is O(n log(n)) time
- return order, else throw error if results.size < #points (non-convex)
您可能希望选择相距足够远的3个点,或者多个点的组合(仍然存在问题),并使THRESHOLD在最大距离之间的某个部分。
通过一些假设,这是可以证明你可以做到的渐近,因为否则,你可以使用它来在不到O(n log(n))
时间内执行比较排序,我们在没有额外知识的情况下知道是不可能的(问题映射是将未排序数组的每个元素X放置在平面中的位置[X,X ^ 2]加上[0,max ^ 2]处的点。)