【发布时间】:2014-12-31 23:33:34
【问题描述】:
我有一个基于双向链表的Polygon2D 类,需要对其进行搜索和修改,并将用于游戏引擎中的各种实用程序,例如碰撞检测以及定义图形形状和可能的纹理坐标等事物。多边形应该可以是凹凸的,但不能与自身相交。
我无法想出一种方法来插入一个不会导致与多边形相交的点。我一直在做的是通过有两个指向节点的指针来搜索最接近要插入的点的边缘,这两个指针都从头部开始并在不同的方向上迭代。当任何一个的“下一个”节点是另一个指针时,搜索完成并且该点被插入到两者之间。否则,向前迭代的节点会一直到它到达最近的点为止(如果下一个节点是另一个指针,则停止),然后“向后”迭代的节点也会这样做。
不幸的是,在向前迭代指针之前的边或向后迭代指针“之后”的边与插入新点时创建的新边相交的情况下,这仍然会导致相交。之后,越来越多的路口很容易溜进去。
Here is the insert method's code.
我可以改进这个算法并且仍然保持它 O(n) 还是有一个完全不同的方法可能会更好?
附带说明,“findClosest[Edge](vec2 pt)”搜索使用了稍微修改过的算法版本,但我觉得必须有一种更有效的方法来执行这些搜索,而无需使用更多内存或时间.
【问题讨论】:
-
我不确定我是否得到了您想要实现的目标。当插入一个新点时,它应该自动插入到离该点最近的 edge 中吗?这将消除一个边缘并用两个新边缘替换它们,对吗?您链接到的代码似乎只是最小化到顶点而不是边缘的距离。为此,您必须计算垂直于边缘的线上新点的欧几里得距离。消除交叉路口仍然是一个不同的问题。
-
它应该被插入到最近边缘的两点之间。这至少会最大限度地减少交叉的机会(实际上,如果我正确理解逻辑,它应该完全消除它)。是的,它会“打破”一个优势并再创造两个优势。那么,我将如何计算到最近边缘的欧几里德距离(或者理想情况下找到最近的边缘而不每次都计算距离)?或者,如果由于某种原因不能消除交叉点,我将如何插入一个点而不创建交叉点?
标签: c++ algorithm geometry polygon game-physics