C# 对多段线数组排序

C# 对多段线数组排序,c#,algorithm,geometry,C#,Algorithm,Geometry,我有以下两门课 public class PointClass { double x, y, z; } 及 和一个多段线类数组 polyLineArray[]; 假设我们以某种顺序连接多段线数组中的所有线,我们得到一条闭合的非自相交曲线 比如说 startPt endPt polyLineArray[0]: (0,0,0) (1,0,0) polyLineArray[1]: (0,1,0) (0,0,0) polyLineArray[2]:

我有以下两门课

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

和一个多段线类数组

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#编码。

考虑使用
(x,y,z)
作为图形的顶点标签,该图形的边正好是多段线数组中的线段
(起点,终点)
。在顶点标签上定义字典顺序。在
O(n log n)
中迭代一次多段线数组时生成图形。在
O(n)
中检测长度
n
的循环,总
O(n)
创建一个类

public class EndPoint {
    PointClass point ;
    int lineIndex ;
}
和一个数组

EndPoint endPoints[] ;
其长度是
polyLineArray
的两倍

对于线
i
的每个端点
e
,创建一个端点
{e,i}
,并将其添加到
端点
数组中。然后按
元素顺序对该数组进行排序。(可以按组件对点进行排序/比较)


排序完成后,可以遍历数组并拾取端点。这些将成对出现,其中点相等,但线索引将指向在该点连接的线。您可以遍历已排序的端点数组,拾取一系列链接的多段线。

在x、y、z附近使用地址变量,使x、y、z、addr指向下一个多点,然后这将是O(n),或者您可以将它们预排序到另一个数组中,然后使用该排序数组,这样您就不必每次都进行排序(即O(1))听起来你在寻找凸包问题。在google/wikipedia上搜索,应该会给你一些关于通用算法的好信息。@huseyintugrulbuyukisik你能详细说明一下答案吗?我不明白你的评论是什么意思。@请注意,由点创建的曲线不一定是凸的。它可能是凹的,所以我不认为凸壳问题会适用于这里,如果我没有弄错的话。@Calpis,那么你有凹壳问题。同样的建议。两者都是一回事。去谷歌/维基百科。你能解释一下顶点标签是什么吗?此外,由于点分布在三维空间中,如何定义字典顺序?“顶点标签”是图形顶点的名称。可以按任何方式标记图形顶点,但在创建图形时,必须跟踪已经存在的顶点,并且算法中的顶点由它们的坐标元组标识。因此,您可以将它们用作标识标签。3d中的词典顺序(实际上是在
IR^n
中)可以通过先按x坐标排序,然后按y坐标排序,最后按z坐标排序来定义。示例:(1,2,3)<(3,2,1);(1,2,3) < (1,3,2);
EndPoint endPoints[] ;