Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我将如何实现鞋带定理来找到由相交线创建的多个凸多边形的区域?_Javascript_Algorithm_Polygon_Intersection_Area - Fatal编程技术网

Javascript 我将如何实现鞋带定理来找到由相交线创建的多个凸多边形的区域?

Javascript 我将如何实现鞋带定理来找到由相交线创建的多个凸多边形的区域?,javascript,algorithm,polygon,intersection,area,Javascript,Algorithm,Polygon,Intersection,Area,我正在创建一段javascript代码,其中需要识别从大量随机生成的相交线创建的每个多边形。下面的屏幕截图将更好地解释我所说的内容: 现在,我需要计算每个多边形的面积并返回最大面积。我采用的方法是识别每个交点(用红点表示),并将它们视为它们所属多边形的顶点。如果我能以某种方式确定每个顶点/交点属于哪个多边形,然后按顺时针方向排列每个多边形的顶点,那么应用鞋带定理来查找每个多边形的面积就很简单了 然而,我担心我完全迷路了,并且尝试了各种(失败的)方法来实现这一点。为每个多边形编译顺时针排列的顶点

我正在创建一段javascript代码,其中需要识别从大量随机生成的相交线创建的每个多边形。下面的屏幕截图将更好地解释我所说的内容:

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


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

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

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

  • 对于每个可能的多边形,请检查该多边形内是否存在任何线段(将多边形的两条边平分的线段),以及是否存在从集合中删除该多边形。最后,你应该只剩下你关心的人。但是这种方法非常慢。 如果我的解释不清楚,我可以更新一些图片来帮助解释


  • 希望这有帮助

    我能想到一种可能性。这里我已经标记了每个顶点

    我假设,如果你知道所涉及的直线及其交点,你可以找到在特定点相交的所有线段。因此,让我们从一个特定的点开始,比如说
    K
    ,以及一个定向段
    IK
    。现在我们有四个定向段,从那一段开始,
    KI
    KJ
    KL
    ,和
    KM
    。我们只对最接近但不在线路上的两个感兴趣
    KI
    。让我们关注一下
    KM
    ,尽管您可以使用
    KJ
    做同样的事情

    (请注意,如果有两条以上的直线在该点相交,我们仍然可以找到离该直线最近的两条直线,通常一条与初始线段形成正角度,另一条为负角度。)

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

    回到原始的
    IK
    ,我们看另一个最小的角度,
    IKJ
    ,然后做一个类似的过程来找到三角形
    IKJ
    。现在我们已经找到了所有包含
    IK
    的多边形

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

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

    我实际上还没有尝试编写这个代码,但我很确定它会起作用