【问题标题】:C++ 2D tessellation library?C++ 2D 曲面细分库?
【发布时间】:2009-09-13 21:05:17
【问题描述】:

我有一些凸多边形存储为点的 STL 向量(或多或少)。我想tessellate他们真的很快,最好是大小相当均匀,没有“条子”。

我打算用它把一些物体炸成小块。有谁知道一个很好的库来细分多边形(将它们划分为较小的凸多边形或三角形的网格)?

我已经查看了一些我已经在网上找到的,但我什至无法编译它们。这些学术类型不太重视易用性。

【问题讨论】:

    标签: c++ geometry computational-geometry tesselation


    【解决方案1】:

    CGAL 有解决这个问题的包。最好的可能是使用2D Polygon Partitioning 包。例如,您可以生成多边形的 y 单调分区(也适用于非凸多边形),您会得到如下结果:

    运行时间为 O(n log n)。

    就易用性而言,这是一个生成随机多边形并对其进行分区的小示例代码(基于this manual example):

    typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
    typedef CGAL::Partition_traits_2<K>                         Traits;
    typedef Traits::Point_2                                     Point_2;
    typedef Traits::Polygon_2                                   Polygon_2;
    typedef std::list<Polygon_2>                                Polygon_list;
    typedef CGAL::Creator_uniform_2<int, Point_2>               Creator;
    typedef CGAL::Random_points_in_square_2<Point_2, Creator>   Point_generator;   
    
    
    int main( )
    {
       Polygon_2    polygon;
       Polygon_list partition_polys;
    
       CGAL::random_polygon_2(50, std::back_inserter(polygon),
                          Point_generator(100));
    
       CGAL::y_monotone_partition_2(polygon.vertices_begin(),
                                    polygon.vertices_end(),
                                    std::back_inserter(partition_polys));
    
       // at this point partition_polys contains the partition of the input polygons
       return 0;
    }
    

    要安装cgal,如果你在windows上,你可以使用安装程序来获取预编译的库,this page上有每个平台的安装指南。它可能不是最简单的安装,但您可以获得最常用和最强大的计算几何库,cgal mailing list 非常有助于回答问题...

    【讨论】:

    • 我之前实际上在尝试过 cgal.... 太丑了。看看那些 typedef!也许我会再试一次。分区我已经有了。 Tessellation 有点不同,除非我把我的术语弄混了。我想要一个精细的网格,而不仅仅是凸随机大小的网格;其中那两个实际上看起来很糟糕。条子太多。
    • 你写过“你不担心网格的质量”,所以我认为这个分区就是你要找的。您想对多边形进行三角剖分,以便您可以控制三角形的质量和大小吗?如果这是您的问题,您可以查看这个 cgal 包:cgal.org/Manual/3.3/doc_html/cgal_manual/Mesh_2/…
    • Err...对不起,我的意思是我对它们不太挑剔细分......但是,它确实需要产生某种网格。我应该更清楚地说明这一点。最后一个链接看起来更像我想要的。谢谢!
    • 如果你想避免条子(正如你在第一条评论中所写的那样),这意味着你更喜欢最小角度的界限。你想要这样的东西吗? www-sop.inria.fr/members/Jane.Tournois/images/seattle_big.png 这张图片和 CGAL 2d 网格剖分包基于一种称为 Delaunay 细化的方法。这里还有另一个开源 Delaunay 网格生成器:cs.cmu.edu/~quake/triangle.html
    【解决方案2】:

    poly2tri 看起来是一个非常好的用于 2D Delaunay 三角剖分的轻量级 C++ 库。

    【讨论】:

    • 只想补充一点,poly2tri 不支持自相交多边形
    【解决方案3】:

    正如上面评论中提到的 balint.miklos,Shewchuk 的 triangle 包非常好。我自己用过很多次;它很好地集成到项目中,并且有triangle++ C++ 接口。如果您想避免裂片,则允许三角形添加(内部)施泰纳点,以便生成高质量的网格(通常是受约束的符合德劳内三角剖分)。

    【讨论】:

      【解决方案4】:

      如果您不想将整个 GCAL 构建到您的应用中 - 这可能更容易实现。

      http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml

      【讨论】:

      • FWIW,这个 Flipcode tessellate 代码非常棒。快速准确地处理任意复杂的多边形。
      【解决方案5】:

      我刚刚开始研究同样的问题,并且正在考虑进行 voronoi 曲面细分。原始多边形将分散半随机点,这些点将成为 voronoi 单元的中心,它们分布得越均匀,单元的大小就越规则,但它们不应该在完美的网格中,否则内部多边形看起来都一样。因此,首先要能够生成这些单元格中心点——在源多边形的边界框上生成它们,并且内部/外部测试不应该太难。

      voronoi 边缘是这张图片中的虚线,是 delaunay 三角剖分的补充。所有尖锐的三角形点都变钝了:

      Boost 具有一些 voronoi 功能: http://www.boost.org/doc/libs/1_55_0/libs/polygon/doc/voronoi_basic_tutorial.htm

      下一步是创建 voronoi 多边形。 Voro++ http://math.lbl.gov/voro++/ 是面向 3D 的,但在其他地方建议使用大约 2d 结构,但比面向 2D voronoi 的软件慢得多。另一个看起来比随机学术主页孤儿项目好得多的软件包是https://github.com/aewallin/openvoronoi

      看起来 OpenCV 曾经支持按照这些思路做一些事情,但它已被弃用(但 c-api 仍然有效?)。 cv::distTransform 仍在维护,但对像素进行操作并生成像素输出,而不是顶点和边缘多边形数据结构,但如果不是你的,可能足以满足我的需求。

      我会在了解更多信息后更新此内容。

      【讨论】:

        【解决方案6】:

        更多关于您想要的输入和输出的细节可能会有所帮助。

        例如,如果您只是想将多边形变成三角形,那么三角形扇形可能会起作用。如果您想将多边形切割成小块,您可以实现某种行进方块。


        好吧,我做了一个错误的假设——我认为行进方块会更类似于行进方块。事实证明这是完全不同的,根本不是我的意思.. :|

        无论如何,要直接回答您的问题,我不知道有任何简单的库可以满足您的需求。我同意 CGAL 的可用性。

        我想到的算法基本上是用线分割多边形,其中线是网格,所以你大多得到四边形。如果你有一个多边形线相交,那么实现会很简单。提出这个问题的另一种方法是将二维多边形视为一个函数,并覆盖一个点网格。然后你只需做一些类似于行进立方体的事情。如果所有 4 个点都在多边形中,则制作一个四边形,如果 3 个在制作一个三角形,2 个在制作一个矩形,等等。可能有点矫枉过正。如果你想要看起来稍微不规则的多边形,你可以随机化网格点的位置。

        另一方面,您可以进行 catmull-clark 样式的细分,但忽略平滑。该算法基本上是在质心和每条边的中点添加一个点。然后对于原始多边形的每个角,您制作一个新的较小的多边形,连接角之前的边缘中点、角、下一个边缘中点和质心。这会平铺空间,并具有与您输入的多边形相似的角度。

        所以,有很多选择,我喜欢头脑风暴解决方案,但我仍然不知道你打算用它做什么。这是为了创建可破坏的网格吗?您是否在进行某种需要较小元素的网格处理?试图避免 Gouraud 着色伪影?这是作为预处理还是实时运行的东西?准确性有多重要?更多信息会产生更好的建议。

        【讨论】:

        • 好吧,就像我说的,我正在将形状分解成小块。我不关心这些位的大小是否完全均匀,但它们仍然应该是位,而不是细长的三角形。我不明白行进正方形有什么意义……这不是为了将位图本质上变成多边形吗?
        • 可破坏的网格,是的。以为我提到了。将实时完成,但希望不是每一帧 :) 这是为了游戏......当两个物体发生剧烈碰撞时,我希望它们爆炸。我会考虑您的建议,谢谢!
        【解决方案7】:

        如果您有凸多边形,并且您不太在意质量,那么这真的很简单 - 只需 ear clipping。别担心,凸多边形不是 O(n^2)。如果您天真地执行此操作(即,在找到耳朵时将其夹住),那么您会得到一个三角扇,如果您想避免裂片,这会有点拖累。两个可以改进三角剖分的简单启发式方法是

        1. 对耳朵进行排序,或者如果太慢了
        2. 随机选择一只耳朵。

        如果您想要基于耳夹的更强大的三角测量器,请查看FIST

        【讨论】:

        • 我知道剪耳,但正如您所指出的,它不会产生很好的效果。但是谢谢:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多