【问题标题】:Determine when a polygon is closed by a new side确定多边形何时被新边封闭
【发布时间】:2018-05-29 02:06:04
【问题描述】:

我的程序有一个 List<Vector3> 的唯一点(A、B、C、...),每次用户绘制唯一的线(1、2、3、...)时都会创建这些点。行存储在List<int> 中,其中每两个整数是每个点的索引以形成单行。两条线不能有相同的两个点,任何点不能占据相同的位置,允许有杂散线。

Diagram

Points: {A, B, C, D, E} //Each letter represents a 2d or 3d position
Sides: {0,1,1,2,1,3,3,4,4,2} //(Each int is an index in Points, every pair is a side)

我试图找到一种有效的方法来确定新线(绿色,5)何时关闭具有任意数量边的多边形。我有这样做的方法:遍历连接到新线(以及所有后续线)每一侧的每条线,直到它们共享一个点 (D)。

Completed Polygon

这里我唯一的问题是多边形的边越多,我需要进行指数级更多的检查(多边形上每两个额外的边都会导致我在所有连接边上检查一层更深的层)。

有没有办法减少关闭多边形所需的检查次数?

Cycles in an Undirected Graph 不完全相同。这知道至少存在一个循环并连接到给定的一侧,并且只寻找可能连接到该侧的最小循环。其他方面无关紧要,应该避免。

【问题讨论】:

  • 在 A 和 C 之间画一条边会发生什么?它应该创建一个与四边形相邻的三角形还是一个忽略边 2 的较大多边形?多边形可以重叠吗?
  • 应该创建第二个多边形(A,B,C),规则与第一个多边形(C,B,D,E)相同
  • Cycles in an Undirected Graph 的可能重复项,因为应该注意您的列表是无向图,而多边形是该图中的循环或循环。
  • 不完全是。这知道至少存在一个循环并连接到给定的一侧,并且只寻找可能的最小循环。

标签: c# unity3d


【解决方案1】:

这完全取决于您需要的优化级别。对于简单的图片(有些像

高级算法:

首先,您需要使用Graph representation 之一来存储图形。然后,每当用户画一条线时,您就取两点中的任何一个并在该点上执行BFS

如果您可以使用 BFS 到达同一点并且路径长度大于 2,那么您就有了一个多边形。

问题在于,由于图形是双向的,因此您在通过它时需要小心。不要重新访问您已经访问过的节点。

【讨论】:

  • 这基本上就是我在第二张图中所做的,虽然我不知道它叫什么。基本上我从每一面做一个 BFS,E 面和 C 面作为每一面的顶层。我在每一层下一层并检查匹配,这将形成一个三角形。如果没有匹配,我在任一侧(C)放置另一层并再次检查匹配,这将是一个四边形。如果那里没有匹配,我在对面 (E) 放置一层并再次检查。我希望一些东西会更有效率,但这可能是目前最快的解决方案。
  • @Philip 我想你理解错了。您只需要从一侧进行 BFS。目标是找到一条返回自身而不重复边缘的圆形路径。 BFS 是 O(n),其中 n 是边(线)的数量,因此它是线性算法而不是指数算法。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2015-01-28
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多