C# 确定多边形何时由新边闭合

C# 确定多边形何时由新边闭合,c#,unity3d,C#,Unity3d,我的程序有一个独特点(a、B、C等)的列表,每次用户绘制独特线(1、2、3等)时都会创建这些点。行存储在列表中,其中每两个int是形成一条直线的每个点的索引。两条线不能有相同的两点,任何点不能占据相同的位置,允许有杂散线 我试图找到一种有效的方法来确定新线(绿色,5)何时闭合任意边数的多边形。我有一种方法:迭代连接到新行(以及所有后续行)每一侧的每一行,直到它们共享一个点(D) 这里我唯一的问题是,多边形的边越多,我需要做的检查就越多(多边形上每增加两条边,我就需要检查所有附加边上更深的一层

我的程序有一个独特点(a、B、C等)的
列表
,每次用户绘制独特线(1、2、3等)时都会创建这些点。行存储在
列表中,其中每两个int是形成一条直线的每个点的索引。两条线不能有相同的两点,任何点不能占据相同的位置,允许有杂散线

我试图找到一种有效的方法来确定新线(绿色,5)何时闭合任意边数的多边形。我有一种方法:迭代连接到新行(以及所有后续行)每一侧的每一行,直到它们共享一个点(D)

这里我唯一的问题是,多边形的边越多,我需要做的检查就越多(多边形上每增加两条边,我就需要检查所有附加边上更深的一层)

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


不完全一样。这知道至少有一个循环存在并连接到给定侧,并且只寻找可能连接到该侧的最小循环。其他方面是不相关的,应该避免它们。

这取决于您需要的优化级别。对于简单的图片(比如<10-100k行),你可以每次运行BFS

高级算法:

首先,您需要使用一个。然后,每当用户绘制一条线时,您都会从两点中选择一点,并在该点上执行一次调整

如果可以使用BFS到达同一点,且路径长度>2,则有一个多边形


问题是,由于图形是双向的,所以在穿过它时需要小心。不要重新访问已访问的节点

在A和C之间绘制边时会发生什么情况?它应该在四边形附近创建一个三角形,还是在忽略边2的情况下创建一个更大的多边形?多边形是否可以重叠?第二个多边形的创建规则(A、B、C)应与第一个多边形(C、B、D、E)的规则相同(C、B、D、E),因为需要注意的是,您的列表是一个无向图,多边形是该图中的循环或循环。不完全是这样。它知道至少有一个循环存在并连接到给定的一侧,并且只寻找可能的最小循环。这基本上就是我在第二个图中所做的,尽管我不知道它被称为什么。基本上我从每一面做一个BFS,E面和C面作为每一面的顶层。我每层下一层,检查是否匹配,这将形成一个三角形。如果没有匹配项,我在任意一侧(C)放置另一层,然后再次检查匹配项,这将是一个四边形。如果没有匹配的,我在另一侧(E)放置一层,然后再次检查。我本来希望有更有效的办法,但这可能是目前最快的解决办法。@Philip我想你理解错了。你只需要从一边做BFS。目标是找到一条返回自身的循环路径,而无需重复边。BFS是O(n),其中n是边(线)的数目,因此它是一个线性算法,而不是指数算法。
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)