Arrays 描述多边形的线段数组的排序和分组

Arrays 描述多边形的线段数组的排序和分组,arrays,sorting,language-agnostic,geometry,line-segment,Arrays,Sorting,Language Agnostic,Geometry,Line Segment,我正在解析一些数据,这些数据以线段数组的形式给出,这些线段描述了几个闭合的任意形状/多边形。这些形状可以是凹的。下面是我所看到的一个简化示例: 但是,我提供的数据具有任意顺序的段。根据这个例子,我的数据类似于{V,E,D,X,U,A,Z,C,B,W,Y}。因此,绘制线段会显示正确的形状,但对形状执行任何操作都不会变得更容易 我正在尝试对上面的数组进行排序,以便每个闭合形状的线段按照连接顺序排列,并且每个形状的线段都分组在一起 所以 将成为 [ {A,B,C,D,E} , {X,Y,Z} , {

我正在解析一些数据,这些数据以线段数组的形式给出,这些线段描述了几个闭合的任意形状/多边形。这些形状可以是凹的。下面是我所看到的一个简化示例:

但是,我提供的数据具有任意顺序的段。根据这个例子,我的数据类似于
{V,E,D,X,U,A,Z,C,B,W,Y}
。因此,绘制线段会显示正确的形状,但对形状执行任何操作都不会变得更容易

我正在尝试对上面的数组进行排序,以便每个闭合形状的线段按照连接顺序排列,并且每个形状的线段都分组在一起

所以

将成为

[ {A,B,C,D,E} , {X,Y,Z} , {U,V,W} ]
每组线段的顺序对我来说并不重要,只是各个线段是有序的。我也不关心每个小组的特定起始部分

所以

[ {Y,Z,X} , {C,D,E,A,B} , {W,U,V} ]
这是一个同样有效的结果


我没有遍历几何体的经验,我的初步尝试和粗略的在线搜索并没有产生任何快速的解决方案。我查看了凹面外壳,但考虑到数据已经知道点之间的连接,这似乎有些过分了。

如果我可以假设您知道每个线段的起点和终点(我们称它们为节点),并且一个多边形从来没有与另一个多边形共用的节点,那么您可以执行以下操作:

  • 列出节点:每个节点由其连接的两段定义。e、 g.节点1是连接A段和e段的节点,节点2是连接A段和B段的节点,等等

  • 将节点分组为多边形,即将共享公共线段的所有节点放在一起

  • 你完了


经过一天的争论,在这里尝试建议,并编写了一些助手类,我想出了一些非常传统的方法。在粗略的伪代码中,我的解决方案是:

create group list;

while (line segments exist in pool)
{
    create new group;
    remove one segment from pool and place into group;

    while (endpoint of last line in group != startpoint of first line in group)
    {
        get the endpoint of the last line in group;
        search pool for line segment whose startpoint = that endpoint;
        remove that segment from the pool and place into group;
    }

    store group in group list;
}
代码依赖于以下假设:我的数据只包含闭合形状(即每个形状的数据整齐地终止于相同的精确坐标),并且所有数据都创建形状,而不仅仅是孤立线。我不确定这是否有效,但考虑到这只是一次预处理步骤,这就足够了。

请看我的答案(编辑部分):
create group list;

while (line segments exist in pool)
{
    create new group;
    remove one segment from pool and place into group;

    while (endpoint of last line in group != startpoint of first line in group)
    {
        get the endpoint of the last line in group;
        search pool for line segment whose startpoint = that endpoint;
        remove that segment from the pool and place into group;
    }

    store group in group list;
}