对描述多边形的线段数组进行排序和分组
Sorting and grouping array of line segments that describes polygons
我正在解析一些数据,以描述几个封闭的任意 shapes/polygons 的线段数组形式给出。这些形状可以是凹形的。这是我正在查看的一个简化示例:
但是,我提供的数据具有任意顺序的段。根据示例,我的数据类似于 {V,E,D,X,U,A,Z,C,B,W,Y}
。因此,绘制线段会显示正确的形状,但对形状进行任何操作都不会变得更容易。
我正在尝试对上面的数组进行排序,以便每个闭合形状的线段按连接顺序排列,并且每个形状的线段都组合在一起。
所以
{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} ]
是一个同样有效的结果。
我没有遍历几何的经验,我的初步尝试和粗略的在线搜索没有产生任何快速的解决方案。我研究了凹壳,但考虑到数据已经知道点之间的联系,这似乎有点过分了。
如果我可以假设您知道每个线段的起点和终点(我们称它们为节点),并且一个多边形永远不会与另一个多边形有公共节点,那么您可以执行以下操作:
列出节点:每个节点由它连接的两个段定义。例如节点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;
}
代码依赖于这样的假设,即我的数据仅包含闭合形状(即每个形状的数据整齐地终止于相同的精确坐标),并且所有数据都会创建形状,而不仅仅是孤立的线条。我不确定这有多有效,但是考虑到它被用作预处理步骤一次,就足够了。
我正在解析一些数据,以描述几个封闭的任意 shapes/polygons 的线段数组形式给出。这些形状可以是凹形的。这是我正在查看的一个简化示例:
但是,我提供的数据具有任意顺序的段。根据示例,我的数据类似于 {V,E,D,X,U,A,Z,C,B,W,Y}
。因此,绘制线段会显示正确的形状,但对形状进行任何操作都不会变得更容易。
我正在尝试对上面的数组进行排序,以便每个闭合形状的线段按连接顺序排列,并且每个形状的线段都组合在一起。
所以
{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} ]
是一个同样有效的结果。
我没有遍历几何的经验,我的初步尝试和粗略的在线搜索没有产生任何快速的解决方案。我研究了凹壳,但考虑到数据已经知道点之间的联系,这似乎有点过分了。
如果我可以假设您知道每个线段的起点和终点(我们称它们为节点),并且一个多边形永远不会与另一个多边形有公共节点,那么您可以执行以下操作:
列出节点:每个节点由它连接的两个段定义。例如节点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;
}
代码依赖于这样的假设,即我的数据仅包含闭合形状(即每个形状的数据整齐地终止于相同的精确坐标),并且所有数据都会创建形状,而不仅仅是孤立的线条。我不确定这有多有效,但是考虑到它被用作预处理步骤一次,就足够了。