我有一些凸多边形存储为STL矢量点(或多或少)。我想要tessellate他们真的很快,最好是大小相当均匀,没有“条子”。
我将用它将一些物品爆炸成小块。有没有人知道一个漂亮的图表来镶边多边形(将它们分成一个较小的凸多边形或三角形的网格)?
我已经看过一些我已经在网上找到的,但我甚至无法让它们编译。这些学术类型并不重视易用性。
答案 0 :(得分:17)
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非常有助于回答问题......
答案 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三角剖分的补充。所有尖锐的三角形点都变得迟钝了:
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)。如果你天真地这样做(也就是你在找到它们的时候夹住耳朵),那么你会得到一个三角扇,如果你试图避开细长条,这有点拖累。可以改善三角测量的两个微不足道的启发式方法是
如果你想要一个基于耳朵剪辑的更强大的三角测量器,请查看FIST。