我有一个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属性的边消失。例如:
将在红线上合并。
然而,当我这样做时,我需要保持点的顺序,使得可以从每条线后面制作完整的多边形。
对此明显的解决方法是在构成多边形的边上循环,当遇到mergeOn边时,切换到另一边但是这不适用于以下情况:
[以这种方式合并两个区域会导致洞中边缘的丢失,而这应该成为它自己的列表。
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)
有些注意事项可能有多个,并且同一点也可能出现在两个以上的边缘(即使这些边缘不是mergeOn) 。
知道什么类型的算法可能在这里工作?
请注意,由于某些潜在的双点精度问题,有时候边缘并不完全匹配,而我自己可以解决这个问题,它确实使得像clipperlib这样的工具不那么有用。
在聊天中进行一些讨论后,这里有一些说明:初始数据中没有两行可以相交,但它们可以共享点(一个点可以在许多不同的行中)。此方法的最终目标是在寻路解决方案中使用它,红线是此代理可以穿过的障碍线,而黑线不能通过(例如,红线可能是河流,而黑线是大型岩石,两栖车辆可以过河而不是岩石)。