平面与多边形网格的交点 - CGAL中的共面三角形处理

时间:2014-07-19 16:27:58

标签: computational-geometry cgal

我想在渲染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;
}

0 个答案:

没有答案