我正在尝试编写一个算法,该算法将获取沿边缘访问的点列表,以及构成对象其余部分并搜索其中的未访问边缘列表(由点对组成)完成边缘的路径(即,将开始连接到结尾)。我目前有:
public static int PolygonSearch(Point start, Point end, List<Point> visitedPoints, List<Point[]> unvisitedEdges)
{
int count = 0;
for (int i = unvisitedEdges.Count - 1; i > -1; i--)
{
Point[] line = unvisitedEdges[i];
if (((Equal(line[0], start) && Equal(line[1], end))
|| (Equal(line[1], start) && Equal(line[0], end)))
&& visitedPoints.Count > 2)
{
return count + 1;
}
else if (Equal(start, line[0]))
{
unvisitedEdges.RemoveAt(i);
count += PolygonSearch(line[1], end, visitedPoints, unvisitedEdges);
}
else if (Equal(start, line[1]))
{
unvisitedEdges.RemoveAt(i);
count += PolygonSearch(line[0], end, visitedPoints, unvisitedEdges);
}
}
return count;
}
(开始和结束是该行的当前起点和终点)
这里显而易见的问题是删除,这会弄乱外部循环,但我不确定如何纠正它,我尝试每次都创建一个新列表但是没有用(我甚至没有实现了一种返回路径的方法,只计算有效的路径。)
任何帮助解决这个问题都将非常感激。
答案 0 :(得分:1)
为避免删除对象,您可以将其设置为“已删除”,如果已设置,则将其忽略。
以下使用名为Visited
的标志。如果“已删除”,则Visited
设置为true。
我没有对此进行过明显的测试,但是它应该让你大致了解该怎么做:
public struct Edge
{
public Edge()
{
this.Visited = false;
}
public Point[] Points;
public bool Visited;
}
public static int PolygonSearch(Point start, Point end, List<Point> visitedPoints, List<Edge> unvisitedEdges)
{
int count = 0;
for (int i = unvisitedEdges.Count - 1; i > -1; i--)
{
Edge line = unvisitedEdges[i];
if (((Equal(line.Points[0], start) && Equal(line.Points[1], end))
|| (Equal(line.Points[1], start) && Equal(line.Points[0], end)))
&& visitedPoints.Count > 2
&& line.Visited == false)
{
return count + 1;
}
else if (Equal(start, line[0]))
{
unvisitedEdges[i].Visited = true;
count += PolygonSearch(line.Points[1], end, visitedPoints, unvisitedEdges);
}
else if (Equal(start, line[0]))
{
unvisitedEdges[i].Visited = true;
count += PolygonSearch(line.Points[1], end, visitedPoints, unvisitedEdges);
}
}
return count;
}