我们有一个由连接器和分段组成的数据集。每个段都有两个连接器,但每个连接器可以属于零个或多个段(即连接器' A'在左下图中没有段,而连接器' M'有三个, MR,ML和MN。)
据了解,无论何处线路相交或相交,都会有连接器,因此我们不必担心偶数/奇数规则,重叠或部分封闭的多边形等等。适用。
简而言之,我们正在尝试识别所有创建的多边形(右图中的彩色形状。)我相信这可以分两步完成。
第1部分:删除多余的项目
独立连接器(连接器' A'这里)可以简单地移除,因为它们不能成为形状轮廓的一部分。
引用单个细分的浮动终点(连接器' B' E')也可以删除,因为它们也不能成为形状的一部分&#39的大纲。这也将删除他们引用的段(B-C和E-D)。
递归地执行上述操作将接下来识别' C'作为终点(因为已经删除了B&B和B-C),所以它和它的剩余段C-D也可以被删除。在下一个递归传递中,连接器' D'和段D-F也将被删除等
然而,我还没有找到识别H-I段的好方法。也就是说,我认为这可以在多边形检测期间实现,因为这样的段只是复合路径的结果,并且在一次形状检测期间可以在两个方向上进行跟踪。 (更多内容见下文。)
第2步:多边形检测
每个细分可以在两个方向上进行追踪。例如,连接' O'和' P'可以是O-P或P-O。采用顺时针方向的轨迹方向,O-P属于多边形O-P-Q-N,而P-O属于多边形P-O-I。
以下逻辑假定顺时针方向为跟踪方向。
从任何线段开始,当跟踪时,如果回到起点,则表明您已经识别出一个潜在的多边形。通过在你追踪时保持你的航向角的运行增量(这是你的航向转动多少,不要与简单地在段之间添加角度混淆),完成后,如果该角度是正的,你和& #39;已检测到有效多边形。如果它是否定的,您已经检测到包含'多边形,表示包含一个或多个“有效”的多边形。多边形。整个形状(或形状)的外周都包含多边形。
考虑方形的情况,对角线分为两个三角形。跟踪每个段两次 - 每个方向一次 - 最终会得到三个可能有效的多边形:一个正方形和两个三角形。三角形将具有正角度增量,告诉您它们有效,但方形角度增量将为负,告诉您包含多边形。
注意:包含多边形也可以等于有效多边形。它只会伤到#39;在相反的方向。
考虑一个简单的三角形。顺时针轨迹将产生有效多边形。顺时针跟踪的第二次尝试实际上会产生一个逆时针的轨迹,它会给你一个负角度增量,告诉你实际上是形状的轮廓。
注意:您还必须通过在形状检测期间测试任何先前遇到的点的每个点来测试沿途遇到的其他多边形。如果您发现重新访问了相同的点,请保存自第一次遇到该点以来创建的多边形,检查它的角度。如果它是正数,则它是一个有效的多边形(并且您实际上当前正在跟踪包含多边形。)如果它是负数,则您检测到包含多边形(其中如果您当前正在跟踪有效多边形。)最后,将累积堆栈上的所有段移回到上次遇到该点的第一个实例,并继续进行检测。
例如,如果你开始在' J'并且逆时针方向跟踪,你会经历“我”,“然后”,“然后”,“然后”和“F' F' F' F' F' F' F'然后你回到了' H'。您刚刚发现了一个具有负角度的多边形H-G-F,因此您知道它包含多边形。从堆栈中删除这三个段并继续。现在你再次点击了我的#39;。在这种情况下,您在此过程中已经访问了相同的细分受众群,但在另一个方向上,只需从您的堆栈中完全删除该细分受众群,然后继续,在“O' O'那么' N'等等。你最终会回到J'。
当在两个方向上跟踪某个细分时,可以考虑使用'并且不需要进一步处理该段。继续处理所有未使用的段。一旦在两个方向上跟踪了所有段,您就可以确定已找到所有多边形 - 有效且包含 - 。
最后,检查每个包含多边形以查看它是否属于任何有效多边形。如果是这样,请将其从有效多边形中排除,从而创建复合路径。在此处的示例中,包含多边形H-G-F的有效青色多边形包含它,因此应将其排除。注意,还有一个有效的H-F-G多边形,这里用红色标记。
无论如何,这就是我所想出的,但我想知道是否有更好/更简单的方法。想法?
答案 0 :(得分:2)
<强>提示强>:
您的问题具有几何方面(不是纯连接),因为面可能不重叠并且已知很简单。我建议使用扫描线方法。
首先清理以丢弃所有浮动端点。
然后考虑一个从顶部到底部,顶点到顶点移动的水平线。在seewpline的每个位置上,它包含或交叉多个段。从左到右对所有顶点/交叉点进行排序,可以得到非重叠的线段。
诀窍是随着扫描线的进展跟踪端点,以便找到区域的左右边界。
在给定的示例中,您将连续考虑点
R K J
RM KL G JI
M L GF GH JI
MN F GH JI
MN H JI
N O I
NQ P
Q
(对表示交叉点)。
由此,您应该能够根据连接性考虑重建左/右轮廓
R M | K L
K L M N | G F H | G H | J I (and embedded G F H | G H)
N Q | O P Q
O P | I P
以下是通过链接扫描线和扫描线的现有边缘的端点和交点获得的图表。
清理后,删除中间顶点: