我将用它来将一些物体炸成小块。有人知道一个好的库来镶嵌多边形(将它们划分为较小的凸多边形或三角形网格)吗?
我已经查看了一些我在网上找到的,但我甚至无法编译它们。这些学术类型不太关心易用性。
CGAL提供了解决这个问题的包。最好使用2D Polygon Partitioning包,例如,您可以生成多边形的y-单调分割(也适用于非凸多边形),然后会得到下面这样的结果:
运行时间为O(n log n)。
在易用性方面,以下是一个生成随机多边形并进行分割的小例子代码(基于这个手册示例):
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;
}
如果你使用Windows系统,可以使用安装程序获取预编译库来安装CGAL,每个平台都有安装指南在此页面上。虽然安装可能不是最简单的,但你将获得当前最广泛和稳健的计算几何库,并且cgal邮件列表非常有帮助,可以回答你的问题...
Poly2tri 看起来是一个非常好用的、轻量级的C++库,可以用于实现二维Delaunay三角网格化。
如上评论中balint.miklos提到的,Shewchuk的triangle包非常不错。我自己也用过很多次;它可以很好地集成到项目中,并且有triangle++ C ++接口。如果你想避免出现slivers,则允许triangle添加(内部)Steiner点,以便生成高质量的网格(通常是约束一致的Delaunay三角剖分)。
如果您想要基于耳朵剪切的更健壮的三角形剖分器,请查看FIST。
好的,我做了一个错误的假设——我认为 marching squares 会更像 marching cubes。结果它是非常不同的,完全不是我想要的.. :|
无论如何,直接回答你的问题,我不知道有任何简单的库可以做到你想要的功能。我同意 CGAL 的易用性。
我想的算法基本上是用线条切割多边形,其中线条是网格,所以你大部分都得到四边形。如果你有一个多边形-线条相交,实现就很简单。另一种表述这个问题的方式是将二维多边形视为函数,并覆盖一个点网格。然后你只需要做类似于 marching cubes 的事情...如果所有4个点都在多边形中,则制作四边形;如果3个在多边形内则制作三角形,2个则制作矩形等等。可能过度设计了。如果你想要略微不规则的多边形,可以随机化网格点的位置。
另一方面,您可以使用Catmull-Clark风格的细分,但省略平滑处理。算法基本上是在重心和每个边的中点处添加一个点。然后对于原多边形的每个角落,您都可以创建一个新的较小多边形,连接到该角落之前的边中点,该角落,下一个边中点和重心。这样铺砌空间,并且其角度类似于您的输入多边形。