我正在创建一段javascript代码,需要识别从多个随机生成的相交线创建的每个多边形。以下屏幕截图将更好地解释我所说的内容:
现在,我需要计算每个多边形的面积并返回最大的面积。我采用的方法是识别每个交叉点(用红点表示)并将它们视为它们所属的任何多边形的顶点。如果我可以以某种方式识别每个顶点/交叉点属于哪个多边形,然后按顺时针方向排列每个多边形的顶点,那么应用鞋带定理来查找每个多边形的区域将很简单。
然而,我担心我完全迷失了,并尝试了各种(失败的)方法来实现这一目标。编译每个多边形的顺时针排列顶点列表的最佳方法是什么?我正在努力获取与每个交叉路口相关的哪些路段,我认为这是向正确方向迈出的一步,但我不知道从那里去哪里。这需要一些矢量工作吗?
答案 0 :(得分:1)
我能想到一种可能性。在这里,我标记了每个顶点。
我假设如果您知道所涉及的线及其交叉点,您可以找到在特定点相交的所有线段。因此,让我们从特定点开始,比如K
和有向段IK
。现在,我们有四个有针对性的细分,从KI
,KJ
,KL
和KM
结束。我们只对最接近但不在行KI
上的两个感兴趣。让我们关注KM
,尽管您可以使用KJ
做同样的事情。
(注意,如果在该点处有两条以上的线相交,我们仍然可以找到最接近该线的两条线,通常一条与初始线段形成正角,另一条线与负线形成正角。)< / p>
我们注意到IKM
是一个正角度,然后检查包含M
的网段,选择具有最小正角度的网格KM
,在这种情况下{{1} },在MF
再次执行此操作(虽然这里只有两个选项)来获取F
,然后FG
,然后GH
,它们完成一个多边形,六边形HI
。
回到IKMFGH
的原始片段,我们会查看另一个最小角度IK
,然后执行类似的过程来查找三角形IKJ
。我们现在找到了包含IKJ
。
当然,你再次这样做,每个其他部分。您将需要删除重复项,或者更聪明的是当您看到它将是重复时不继续分析路径。 (每个角度最多只能包含一个多边形,因此如果您看到已经记录的角度,则可以跳过它。)
如果您的多边形不是凸面的,那么这将不起作用,但如果它们是由切割成矩形的线条制成的,我很确定它们将始终是凸的。
我实际上并没有尝试过编码,但我很确定它会起作用。
答案 1 :(得分:0)
我能想到的两种方法可能不是最有效的,但应该有所帮助:
您可以通过绘制从任意点到另一个点的虚线来计算构成包含任意点的多边形的点集,绘制线的图像不与图像中的任何线相交是您所关心的凸多边形的顶点。这种方法的问题是我无法想到任何特别好的方法来可靠地获取所有多边形(因为你只关心最大的随机/周期性采样就足够了吗?)
对于每个可能的多边形检查,以查看是否存在位于该多边形内的任何线段(将多边形的两条边分成两半的线段)以及是否从集合中移除了该多边形。最后,你应该只留下你关心的人。但这种方法很慢。 如果我的解释不清楚,我可以用几张图片进行更新以帮助解释。
希望这有帮助!