c++ - 使用 CGAL 将多面体投影到 xy 平面
问题描述
我正在努力计算多面体在 xy 平面上的投影。目前我使用以下代码:
vector<Polygon_2> ii;
vector<Polygon_with_holes_2> oi;
for (Facet_iterator s = polyhedron.facets_begin();
s != polyhedron.facets_end(); ++s) {
Halfedge_facet_circulator h = s->facet_begin(), he(h);
Polygon_2 polygon;
do {
Point p1 = h->vertex()->point();
polygon.insert(polygon.vertices_end(), Point_2(p1.x(), p1.y()));
} while (++h != he);
if (polygon.orientation() == CGAL::NEGATIVE)
polygon.reverse_orientation();
ii.push_back(polygon);
}
CGAL::join(ii.begin(), ii.end(), std::back_inserter(oi));
这会在多面体表面上进行迭代,并为每个表面手动执行 2d 投影。然后将生成的多边形连接在一起。
但是,从手册中我觉得这不是将库用于此类任务的预期方式。该课程Project_traits_xy_3
提示,有一种常规方法可以使用 CGAL 实现投影。但是,我找不到合适的文档或示例。
谁能在这里指出我正确的方向?我觉得,这应该是一个优雅的标准任务。
解决方案
您正在寻找的是轮廓的计算,而我们在 CGAL 中没有将其作为高级功能。您的代码完成了这项工作。
如果你的对象是防水的,你可以只取法线向上的面。您还可以计算法线向上的面的连通分量,然后为这些分量的边界创建多边形。
投影特征类用于将 3D 点解释为 2D 点,例如构造 2D 约束 Delaunay 三角剖分,但我看不出它在哪里可以派上用场。
推荐阅读
- asp.net-mvc - 在 ASP.net MVC 5 HTML Helper Extension 中动态创建 ID
- java - Android:快速滚动 ListView getPositionForSection 的奇怪行为
- asp.net - 从 .netcore 2.1 迁移到 asp.net 4.7.2 后未找到 System.Net.Http
- bash - 根据分隔符在bash中拆分字符串
- android - Android 运行时权限问题
- python - 将一列中的单元格组合成一个字符串
- machine-learning - 微调 Resnet-50 模型所需的特定训练数据量
- bash - Bash 提取 tar.gz 文件
- ubuntu - Ubuntu Systemd 脚本无法正确执行
- error-handling - 客户端错误请求的 400 与 422