我想在渲染3D多边形网格的2D切片时使用CGAL替换vtkCutter。为了获得高性能,我使用AABB_tree,实际上,交叉点生成得更快。但是,当三角形(或它们的边)与查询平面共面时,结果相当随意 - 可能是由于数字舍入问题。由于我需要高性能,我使用Simple_cartesian<double>
内核。
有没有办法在CGAL中控制此行为?例如,我可以指定某种公差,以便如果三角形的两个点在平面的公差范围内 - 边缘被认为是位于平面中吗?
干杯, 罗斯季斯拉夫。
代码:
#include <iostream>
#include <list>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point;
typedef K::Vector_3 Vector;
typedef K::Plane_3 Plane;
typedef K::Segment_3 Segment;
typedef K::Triangle_3 Triangle;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef std::list<Segment>::iterator Iterator;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron, CGAL::Default, CGAL::Tag_false> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
int main()
{
Polyhedron polyhedron;
std::ifstream inFile("mesh.off");
inFile >> polyhedron;
std::ifstream planeIn("plane.txt");
double a[9];
for (int i = 0; i < 9; ++i) {
planeIn >> a[i];
}
Tree tree(polyhedron.facets_begin(), polyhedron.facets_end(), polyhedron);
tree.accelerate_distance_queries();
Point points[] = { { a[0], a[1], a[2] }, { a[3], a[4], a[5] }, { a[6], a[7], a[8] } };
Plane plane_query(points[0], points[1], points[2]);
std::vector<Tree::Intersection_and_primitive_id<Plane>::Type> segments;
tree.all_intersections(plane_query, std::back_inserter(segments));
return EXIT_SUCCESS;
}