对多线阵列进行排序

时间:2013-05-14 17:22:40

标签: c# algorithm geometry

我有以下两个类

public class PointClass
{
    double x, y, z;
}  

public class PolyLineClass
{
    PointClass startPoint;
    PointClass endPoint;
}

和PolyLineClasses数组

polyLineArray[];

假设如果我们以某种顺序连接polyLineArray中的所有行,我们将获得一个封闭的非自相关曲线。

例如

                  startPt  endPt
polyLineArray[0]: (0,0,0) (1,0,0)
polyLineArray[1]: (0,1,0) (0,0,0)
polyLineArray[2]: (1,1,0) (0,1,0)
polyLineArray[3]: (1,0,0) (1,1,0)

如果我们以0-> 3-> 2> 1的顺序遍历数组,我们创建一个闭合曲线(在这个简单的情况下,是一个正方形)。 现在,我所拥有的是以下算法:

1) int i = 0; 
2) Get the endPt of polyLineArray[i];
3) search through the array for an element with index j such that 
   polyLineArray[i].endPoint == polyLineArray[j].startPoint.
4) i = j; Repeat from step2 until all elements in the array have been visited.

上述算法是O(可怕)。有更有效的方法进行排序吗? 如果语言很重要,我在c#编码。

2 个答案:

答案 0 :(得分:1)

考虑使用(x,y,z)作为图形的顶点标签,其边缘恰好是折线阵列中的线段(startPoint, endPoint)。在顶点标签上定义词典顺序。在O(n log n)中迭代一次通过折线数组时构建图形。检测nO(n)长度为O(n)的周期,总计为{{1}}。

答案 1 :(得分:1)

创建一个类

public class EndPoint {
    PointClass point ;
    int lineIndex ;
}

和一个数组

EndPoint endPoints[] ;

,其长度是polyLineArray的两倍。

对于行e的每个结束点i,创建一个EndPoint {e,i}并将其添加到endPoints数组中。然后以point元素顺序对此数组进行排序。 (这些点可以按组件分类/比较)。

排序完成后,您可以遍历数组并选择EndPoints。这些将成对出现,其中点相等,但行索引将指向在该点处连接的线。您可以遍历已排序的EndPoint阵列,获取一系列链接的PolyLines。