2

我正在创建一段 javascript 代码,其中有必要识别从许多随机生成的相交线创建的每个多边形。以下屏幕截图将更好地解释我在说什么:

现在,我需要计算每个多边形的面积并返回最大的面积。我采用的方法是识别每个交叉点(用红点表示)并将它们视为它们所属的任何多边形的顶点。如果我能以某种方式识别每个顶点/交点属于哪个多边形,然后按顺时针方向排列每个多边形的顶点,那么应用鞋带定理来找到每个多边形的面积会很简单。

但是,恐怕我完全迷失了,并尝试了各种(失败的)方法来实现这一目标。为每个多边形编译顺时针排列的顶点列表的最佳方法是什么?我正在努力获取与每个给定交叉点相关的路段,我认为这是朝着正确方向迈出的一步,但我不知道从那里去哪里。这需要一些矢量工作吗?

4

2 回答 2

1

我能想到一种可能。在这里,我标记了每个顶点。


(来源:i.imm.io

我假设如果您知道所涉及的线及其交叉点,您可以找到在特定点相交的所有线段。所以让我们从一个特定的点开始,比如说K和一个有向段,IK。现在我们有四个有向线段,它们从末尾开始,KIKJKLKM。我们只对最接近但不在线的两个感兴趣KI。让我们专注于KM,尽管您可以使用 来做同样的事情KJ

(注意,如果点相交的直线多于两条,我们仍然可以找到最接近直线的两条,一般一条与初始线段成正角,另一条与初始线段成负角。)

我们注意到这IKM是一个正角,然后检查包含 的线段M,选择与 具有最小正角的线段KM,在这种情况下MF,在 处再次执行此操作F(尽管这里只有两个选择)得到FG,然后GH,然后HI,它完成了一个多边形,六边形IKMFGH

回到我们原来的片段IK,我们查看另一个最小的角度 ,IKJ并执行类似的过程来找到三角形IKJ。我们现在已经找到了所有包含IK.

然后当然你再做一次,每个其他部分。您将需要删除重复项,或者在您看到它是重复项时不继续分析路径更聪明。(每个角度最多在一个多边形中,因此如果您看到已记录的角度,您可以跳过它。)

如果你的多边形不是凸的,这将不起作用,但如果它们是由穿过矩形的线制成的,我很确定它们总是凸的。

我实际上并没有尝试对此进行编码,但我很确定它会起作用。

于 2013-09-04T03:31:28.310 回答
0

我能想到的两种方法可能不是最有效的,但应该有所帮助:

  1. 您可以通过从任意点到另一个点绘制一条假想线来找出构成包含任意点的多边形的点集,绘制一条不与图像中任何线相交的线的顶点是使你关心的凸多边形。这种方法的问题是我想不出任何特别好的方法来可靠地获取所有多边形(因为您只关心可能最大的随机/定期采样就足够了?)

  2. 对于每个可能的多边形,检查是否有任何线段位于该多边形内(一条将多边形的两条边一分为二的线段)以及是否从您的集合中删除该多边形。最后,您应该只留下您关心的人。这种方法虽然很慢。如果我的解释不清楚,我可以更新几张图片来帮助解释。

希望这可以帮助!

于 2013-09-04T02:43:23.157 回答