【问题标题】:How would I implement the shoelace theorem to find the areas of multiple convex polygons created from intersecting lines?我将如何实现鞋带定理来找到从相交线创建的多个凸多边形的区域?
【发布时间】:2013-09-07 09:40:22
【问题描述】:
我正在创建一段 javascript 代码,其中有必要识别从许多随机生成的相交线创建的每个多边形。以下屏幕截图将更好地解释我在说什么:
现在,我需要计算每个多边形的面积并返回最大的面积。我采用的方法是识别每个交叉点(用红点表示)并将它们视为它们所属的任何多边形的顶点。如果我能以某种方式确定每个顶点/交点属于哪个多边形,然后将每个多边形的顶点按顺时针方向排列,那么应用鞋带定理来找到每个多边形的面积会很简单。
但是,我担心我完全迷失了,并尝试了各种(失败的)方法来实现这一点。为每个多边形编译顺时针排列的顶点列表的最佳方法是什么?我正在努力获取与每个给定交叉点相关的路段,我认为这是朝着正确方向迈出的一步,但我不知道从那里去哪里。这需要一些矢量工作吗?
【问题讨论】:
标签:
javascript
algorithm
polygon
intersection
area
【解决方案1】:
我能想到的两种方法可能不是最有效的,但应该会有所帮助:
您可以通过绘制一条从任意点到其他点的假想线来计算构成包含任意点的多边形的点集,即绘制一条不与图像中任何线相交的线是构成您关心的凸多边形的顶点。这种方法的问题是我想不出任何特别好的方法来可靠地获取所有多边形(因为您只关心可能最大的随机/周期性采样就足够了?)
对于每个可能的多边形,检查是否有任何线段位于该多边形内(一条将多边形的两条边一分为二的线段),以及是否从您的集合中删除该多边形。最后,您应该只留下您关心的人。这种方法虽然很慢。
如果我的解释不清楚,我可以更新几张图片来帮助解释。
希望这会有所帮助!
【解决方案2】:
我能想到一种可能性。在这里,我标记了每个顶点。
(来源:i.imm.io)
我假设如果您知道所涉及的线及其交叉点,您可以找到在特定点相交的所有线段。所以让我们从一个特定的点开始,比如K,以及一个有向段,IK。现在我们有四个从其末尾开始的定向段,KI、KJ、KL 和 KM。我们只对最接近但不在KI 行上的两个感兴趣。让我们关注KM,尽管您可以使用KJ 做同样的事情。
(注意,如果点相交的直线多于两条,我们仍然可以找到最接近直线的两条,一般一条与初始线段成正角,另一条与初始线段成负角。)
我们注意到IKM 是一个正角,然后检查包含M 的线段,选择与KM 正角最小的线段,在本例中为MF,在@987654337 再次执行此操作@(虽然这里只有两种选择)得到FG,然后是GH,然后是HI,这样就完成了一个多边形,六边形IKMFGH。
回到我们的原始片段IK,我们查看另一个最小的角度IKJ,并执行类似的过程来找到三角形IKJ。我们现在已经找到了所有包含IK 的多边形。
那么你当然会再次这样做,每个其他部分。您将需要删除重复项,或者在您看到它是重复项时不继续分析路径更聪明。 (每个角度最多在一个多边形中,所以如果您看到已经记录的角度,您可以跳过它。)
如果你的多边形不是凸的,这将不起作用,但如果它们是由穿过矩形的线组成的,我很确定它们总是凸的。
我实际上并没有尝试编写此代码,但我很确定它会起作用。