【问题标题】:Adding a point to a 2D polygon将点添加到 2D 多边形
【发布时间】: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


【解决方案1】:

至于计算从给定点到顶点的距离,Distance from a point to a polygon 可能会有所帮助。

【讨论】:

  • It doesn't seem to actually choose the closest edge。知道为什么吗?等效距离,因此不会触发“小于”的检查?
  • 没关系,我的代码中有一个错误,一切正常。
  • @CaveDweller 很高兴听到
  • 在某些边缘情况下仍然存在自相交的问题(到边缘的距离被认为是不同边缘上的同一点)。
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多