C ++ 2D曲面细分库?

时间:2009-09-13 21:05:17

标签: c++ geometry computational-geometry tesselation

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

我将用它将一些物品爆炸成小块。有没有人知道一个漂亮的图表来镶边多边形(将它们分成一个较小的凸多边形或三角形的网格)?

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

7 个答案:

答案 0 :(得分:17)

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

y-monoyone-partitioning y-monoyone-partitioning

运行时间为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非常有助于回答问题......

答案 1 :(得分:9)

poly2tri看起来像2D Delaunay三角剖分的非常好的轻量级C ++库。

答案 2 :(得分:3)

正如上面评论中提到的balint.miklos,Shewchuk的triangle包非常好。我自己多次使用它;它很好地集成到项目中,并且有triangle++ C ++接口。如果你想避免细长,那么允许三角形添加(内部)Steiner点,这样你就可以生成一个高质量的网格(通常是一个约束的符合delaunay三角剖分)。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

我刚开始研究同样的问题,我正在考虑voronoi曲面细分。原始多边形将获得散射的半随机点,这些半随机点将成为voronoi单元的中心,它们的分布越均匀,单元格的大小将越规则,但它们不应处于完美的网格中,否则内部多边形看起来都一样。所以第一件事就是能够生成那些细胞中心点 - 在源多边形的边界框上生成它们,内部/外部测试不应该太难。

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

enter image description here

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,但是对像素进行操作并生成像素输出,而不是顶点和边缘多边形数据结构,但如果不是你的话,可能就足够了。

一旦我学到了更多,我就会更新。

答案 5 :(得分:1)

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

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


好吧,我做了一个错误的假设 - 我假设行军广场更像是行进立方体。事实证明它完全不同,而不是我的意思..:|

在任何情况下,要直接回答您的问题,我不知道任何简单的库可以满足您的需求。我同意CGAL的可用性。

我想到的算法基本上是用线条分割多边形,其中线条是网格,所以你大多数都是四边形。如果你有一个多边形线交叉点,实现将很简单。造成这个问题的另一种方法是像处理函数一样处理2d多边形,并覆盖点网格。然后你只需要做一些类似于行进立方体的东西..如果所有4个点都在多边形中,做一个四边形,如果3个在做一个三角形,2个在做一个矩形,等等。可能是矫枉过正。如果您想要略微不规则的多边形,则可以随机化网格点的位置。

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

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

答案 6 :(得分:1)

如果你有凸多边形,并且你的质量没有太多,那么这很简单 - 只需做ear clipping。别担心,凸多边形不是O(n ^ 2)。如果你天真地这样做(也就是你在找到它们的时候夹住耳朵),那么你会得到一个三角扇,如果你试图避开细长条,这有点拖累。可以改善三角测量的两个微不足道的启发式方法是

  1. 对耳朵进行分类,或者如果太慢,
  2. 随意选择一个耳朵。
  3. 如果你想要一个基于耳朵剪辑的更强大的三角测量器,请查看FIST