我的程序有List<Vector3>
个唯一点(A,B,C,...),每次用户绘制一条唯一线(1,2,3,...)时都会创建这些点。行存储在List<int>
中,其中每两个整数是每个点的索引,以形成一条线。没有两条线可以具有相同的两个点,没有点可以占据相同的位置,并且允许杂散线。
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)。
我唯一的问题是多边形越多,我需要做更多的检查(多边形上每两个额外的边使我检查所有连接边上的一层更深)。
有没有办法减少为了关闭多边形而需要做的检查次数?
与Cycles in an Undirected Graph不完全相同。这知道至少存在一个循环并连接到给定侧,并且仅查找可能连接到该侧的最小循环。其他方面无关紧要,应避免使用它们。
答案 0 :(得分:1)
这一切都取决于您需要的优化级别。对于简单的图片(有些像&lt; 10 - 100k行),你每次都可以运行BFS。
高级算法:
首先,您需要使用Graph representation之一来存储图表。然后,每当用户绘制一条线时,您可以选择两个点中的任意一个并在该点上执行BFS。
如果你可以与你的BFS达到相同的点,并且路径长度是> 2然后你有一个多边形。
因为图表是双向的,所以你需要在走过它时要小心。不要重新访问您已访问过的节点。