Algorithm 特殊方向上的多边形分解

Algorithm 特殊方向上的多边形分解,algorithm,computational-geometry,polygons,decomposition,Algorithm,Computational Geometry,Polygons,Decomposition,我正在寻找一个可以进行多边形分解的库。我想定义多边形应该分割的方向或线,如下图所示: 这样我就得到了小多边形。有人知道支持这一点的图书馆吗 有什么想法吗?我不知道你用的是哪种语言。我有一个为我的目的而编写的库,它可以通过给定的线集获得完整的分区,并返回多边形。它是在PHP上编写并调用的,使用它,您可以通过以下方式解决您的问题: 通过一组线LineSet_2D或多边形_2D定义多边形 也可通过线_2D定义分割线 使用LineSet_2D方法getPolygons查找所有多边形 我写了一个例子:

我正在寻找一个可以进行多边形分解的库。我想定义多边形应该分割的方向或线,如下图所示:

这样我就得到了小多边形。有人知道支持这一点的图书馆吗


有什么想法吗?

我不知道你用的是哪种语言。我有一个为我的目的而编写的库,它可以通过给定的线集获得完整的分区,并返回多边形。它是在PHP上编写并调用的,使用它,您可以通过以下方式解决您的问题:

  • 通过一组线LineSet_2D或多边形_2D定义多边形
  • 也可通过线_2D定义分割线
  • 使用LineSet_2D方法getPolygons查找所有多边形
  • 我写了一个例子:

    //define or polygon. Note that Polygon_2D can also be used
    $rPolygon = new LineSet_2D(
        new Line_2D( 0, 3, 1, 1),
        new Line_2D( 1, 1, 3, 0),
        new Line_2D( 3, 0, 1,-1),
        new Line_2D( 1,-1, 0,-3),
        new Line_2D( 0,-3,-1,-1),
        new Line_2D(-1,-1,-3,0),
        new Line_2D(-3, 0,-1, 1),
        new Line_2D(-1, 1, 0, 3)
    );
    //define partition line set
    $rPartition = new LineSet_2D(
        new Line_2D(-1, 1, 1,-1),
        new Line_2D(-1,-1, 1, 1)
    );
    //result line set:
    $rResultSet    = LineSet_2D::createFromArray(array_merge(
        $rPolygon->getLines(), 
        $rPartition->getLines()
    ));
    //for example, dump plain result:
    var_dump($rResultSet->getPolygons());
    
    您也可以找到此示例,但我认为它不是您问题的精确解决方案,因为我的LineSet_2D类将返回所有循环多边形(即,不仅是“碎片”)。

    您正在寻找“多边形切块”布尔运算。你可以在谷歌上搜索可用资源

    有些人会要求你自己做这件事。。 对于每一条切片线

  • 查找切片线与多边形边的交点
  • 对于与其相交的每条边,将边拆分为两条
  • 将与分割边对应的多边形分割为两个多边形
  • 对所有多边形执行相同的操作。
    你必须注意特殊情况,比如分割穿过顶点的线等等

    从图片上看,这并不明显-将直线添加到结果分区的标准是什么(直线,即存在边,但也有一些直线穿过多边形的边)。直线应具有边的方向,并从每个边点开始。但我的目标是定义随机方向,并在这个方向上进行分解。所以,它只是一组线?我的意思是,输入是:将被分解的polugon和一些线(让它们与多边形的边平行)。你期望结果是什么?一组新多边形?是的,我想输出一组小多边形,输入是多边形和一组线。我找到了这个库。你知道一个函数可以解决我的问题吗?嘿,谢谢你的回答,我用C++。你说的循环多边形是什么意思?我的解决方案应该是每个多边形,例如A,B,c。。。。在我的FiguleWror中,我认为将PHP改编成C++并不难(因为C++具有更多的语法和OOP能力)。通过提到循环多边形,我的意思是你将通过LineSet_2D进行分区,你将得到所有多边形,而不仅仅是原始多边形的碎片。例如:想象一个有两条对角线的正方形。它被分为4个部分,但它有更多的真实多边形,因为不仅有“小”三角形部分,还有“大”(半个正方形)三角形,甚至没有三角形(整个正方形没有一个小三角形部分)。你是说像diff等操作吗?在这种情况下这是可能的,但我想我有很多库,它们可以处理2个多边形,所以它应该有一些多边形和线?我不确定是否有库可以为您处理这些。我不使用其他人,因为我只使用一个。此外,除了交集例程之外,它更像是一个数据结构问题。所以,如果你找不到一个,我想很可能就是这样。你可以自己写一本。这并不难,而且可能很有趣。另外,您可以在将来自己修复任何bug。