跨越某些边合并多边形的算法

时间:2016-08-18 12:56:35

标签: c# algorithm graph geometry

我有一个XY点边缘列表列表,我希望在某些边缘合并,

这是一个略微简化的版本:

class XY{
    double X;
    double Y;
    public XY(double x, double y){
       this.X=x;
       this.Y=y;
    }
}

Edge {
    XY p1;
    XY p2;
    bool mergeOn;
}

现在我想合并这些列表/多边形,以便所有具有mergeOn属性的边消失。例如: two squares seperated by red line

将在红线上合并。

然而,当我这样做时,我需要保持点的顺序,使得可以从每条线后面制作完整的多边形。

对此明显的解决方法是在构成多边形的边上循环,当遇到mergeOn边时,切换到另一边但是这不适用于以下情况:

[it looks great以这种方式合并两个区域会导致洞中边缘的丢失,而这应该成为它自己的列表。

List l1= new List<edge>();
l1.add(new Edge(new XY(0,0) , new XY(10,0),false));
l1.add(new Edge(new XY(10,0) , new XY(10,3),true));
l1.add(new Edge(new XY(10,3) , new XY(10,7),false));
l1.add(new Edge(new XY(10,7) , new XY(10,10),true));
l1.add(new Edge(new XY(10,10) , new XY(0,10),false));
l1.add(new Edge(new XY(0,10) , new XY(0,0),false));

l2.add(new Edge(new XY(20,0) , new XY(20,10),false));
l2.add(new Edge(new XY(20,10) , new XY(10,10),false));
l2.add(new Edge(new XY(10,10) , new XY(10,7),true));
l2.add(new Edge(new XY(10,7) , new XY(12,7),false));
l2.add(new Edge(new XY(12,7) , new XY(12,3),false));
l2.add(new Edge(new XY(12,3) , new XY(10,3),false));
l2.add(new Edge(new XY(10,3) , new XY(10,0),true));
l2.add(new Edge(new XY(10,0) , new XY(20,0),true));

merge(new list{l1,l2}); 

应该会产生这样的结果 列表{L3,L4} l3正在

new Edge(new XY(0,0) , new XY(20,0),false)
new Edge(new XY(20,0) , new XY(20,10),false)
new Edge(new XY(20,10) , new XY(0,10),false)
new Edge(new XY(0,10) , new XY(0,0),false)

和l4

new Edge(new XY(10,3) , new XY(12,3),false)
new Edge(new XY(12,3) , new XY(12,7),false)
new Edge(new XY(12,7) , new XY(10,7),false)
new Edge(new XY(10,7) , new XY(10,3),false)

有些注意事项可能有多个enter image description here,并且同一点也可能出现在两个以上的边缘(即使这些边缘不是mergeOn) 。

知道什么类型的算法可能在这里工作?

请注意,由于某些潜在的双点精度问题,有时候边缘并不完全匹配,而我自己可以解决这个问题,它确实使得像clipperlib这样的工具不那么有用。

在聊天中进行一些讨论后,这里有一些说明:初始数据中没有两行可以相交,但它们可以共享点(一个点可以在许多不同的行中)。此方法的最终目标是在寻路解决方案中使用它,红线是此代理可以穿过的障碍线,而黑线不能通过(例如,红线可能是河流,而黑线是大型岩石,两栖车辆可以过河而不是岩石)。

0 个答案:

没有答案