【问题标题】:Sorting an array of polyLines对折线数组进行排序
【发布时间】:2013-05-14 17:22:39
【问题描述】:

我有以下两个类

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

【问题讨论】:

  • 在 x,y,z 附近使用地址变量,使得 x,y,z,addr 指向下一个多点,那么这将是 O(n) 或者您可以将它们预先排序到另一个数组中然后使用该排序数组,这样你就不必每次都排序(这是 O(1))
  • 听起来您正在寻找凸包问题。在 google/wikipedia 上搜索应该会给你一些关于使用一般算法的好信息。
  • @huseyintugrulbuyukisik 您能否详细说明答案?我对您的评论的意思感到困惑。
  • @Servy 点创建的曲线不一定是凸的。它可能是凹的,所以如果我没记错的话,我认为凸包问题不会适用于此。
  • @Calpis 那么你有凹壳问题。同样的建议。两者都是一回事。转到谷歌/维基百科。

标签: c# algorithm geometry


【解决方案1】:

创建一个类

public class EndPoint {
    PointClass point ;
    int lineIndex ;
}

还有一个数组

EndPoint endPoints[] ;

长度是polyLineArray的两倍。

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

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

【讨论】:

    【解决方案2】:

    考虑将(x,y,z) 用作图的顶点标签,该图的边恰好是折线数组中的线段(startPoint, endPoint)。在顶点标签上定义字典顺序。在遍历O(n log n) 中的折线数组时构建图形。在O(n)中检测一个长度为n的循环,总共O(n)

    【讨论】:

    • 您能解释一下什么是顶点标签吗?另外,由于点分布在 3d 空间中,如何定义字典顺序?
    • '顶点标签'是图顶点的名称。您可以以任何您喜欢的方式标记图形顶点,但是在创建图形时,您必须跟踪已经存在的顶点,并且算法中的顶点由它们的坐标元组标识。因此,您可以将它们用作识别标签。 3d 中的字典顺序(实际上在IR^n 中)可以通过首先按 x 坐标排序,然后按 y,最后按 z 来定义。例如:(1,2,3)
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多