使用 Boost 对多边形进行三角剖分的最佳方法是什么?
我使用Boost.polygon。
我目前的算法:
从我的多边形顶点计算一个 voronoï 图。
为每个单元格边缘创建一个有向多边形边缘(这将为每个单元格边缘创建两个有向多边形边缘)
迭代所有创建的边以创建三角形(不是微不足道的)
有更好的解决方案吗?
编辑:我刚刚意识到有可能以一种特殊的方式穿过单元格以直接创建三角形(3 个相邻单元格创建一个三角形)。
使用 Boost 对多边形进行三角剖分的最佳方法是什么?
我使用Boost.polygon。
我目前的算法:
从我的多边形顶点计算一个 voronoï 图。
为每个单元格边缘创建一个有向多边形边缘(这将为每个单元格边缘创建两个有向多边形边缘)
迭代所有创建的边以创建三角形(不是微不足道的)
有更好的解决方案吗?
编辑:我刚刚意识到有可能以一种特殊的方式穿过单元格以直接创建三角形(3 个相邻单元格创建一个三角形)。
主要思想是遍历 Voronoi 顶点,并从每个单元格在 Voronoi 顶点上的生成点创建一个三角形。在度数 > 3 的退化顶点的情况下,您需要生成多个三角形,但使用三角形扇很容易完成。
使用增强多边形:
#include "boost/polygon/voronoi.hpp"
std::vector<Point> vertices;
// add your input vertices
boost::polygon::voronoi_diagram<double> vd;
boost::polygon::construct_voronoi(vertices.begin(), vertices.end(), &vd);
for (const auto& vertex: vd.vertices()) {
std::vector<Point> triangle;
auto edge = vertex.incident_edge();
do {
auto cell = edge->cell();
assert(cell->contains_point());
triangle.push_back(vertices[cell->source_index()]);
if (triangle.size() == 3) {
// process output triangles
std::cout << "Got triangle:" << triangle << std::endl;
triangle.erase(triangle.begin() + 1);
}
edge = edge->rot_next();
} while (edge != vertex.incident_edge());
}
另请参阅如何从 Voronoï 图进行三角剖分?有关该问题的更多背景信息。