【发布时间】:2019-05-22 10:49:02
【问题描述】:
我想有效地找到包含在体积中或与体积相交的所有三角形(例如多面体网格的面)(例如 AABB 或球体查询)。如果可能且合理,我想使用 CGAL 内置功能来做到这一点。
我目前的解决方案是简单的蛮力:对于网格中的所有面,检查面到球中心的距离是否小于球半径。我之前在顶点上使用了 KD-tree 的模糊球体查询,但它对我的应用程序来说不够准确。我需要完整的球体三角形交点。
CGAL AABB 树 (https://doc.cgal.org/latest/AABB_tree/index.html) 似乎是最好的数据结构,但我需要 3D 线性内核,它对三角形和任何类型的体积 (https://doc.cgal.org/latest/Kernel_23/group__intersection__linear__grp.html) 没有交叉测试。 CGAL KD 树不起作用,因为它只能包含点。
我的想法是:
- 为 AABB 树可以使用的 Triangle_3 和 Sphere_3 添加自定义 do_intersect()。这甚至可能吗?这可能还需要自定义 squared_distance()。
- 通过将三角形投影到例如,将体积查询转换为两个区域查询XY 和 YZ 平面。 AABB 树甚至可以处理 2D 搜索吗?圆形和 2D 三角形没有交集,但我可以使用 Iso_rectangle_2 和 Triangle_2 的交集作为初步猜测。
- 不知何故遍历 AABB 树的内部并在我找到不再包含我的查询的节点之前停止。
- 修改closest_point_and_primitive() 方法,提供可选的max_distance 参数并返回该距离内的所有图元。这需要我弄乱 CGAL 代码。
- 编写我自己的数据结构。这需要一些时间才能正确完成。
我错过了什么吗?哪种解决方案最省力?
【问题讨论】:
标签: cgal