文档阅读
在CGAL网格处理包中法向量计算部分,共提供如下5个函数:
CGAL::Polygon_mesh_processing::compute_face_normal()
CGAL::Polygon_mesh_processing::compute_vertex_normal()
CGAL::Polygon_mesh_processing::compute_face_normals()
CGAL::Polygon_mesh_processing::compute_vertex_normals()
CGAL::Polygon_mesh_processing::compute_normals()
.
其中,前两个分别计算单个面和顶点的法向量,第三第四个分别计算网格所有的面和顶点的法向量,最后一个同时计算网格所有面和顶点的法向量。
被计算得到的法向量将以属性图的形式进行记录。
代码测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Surface_mesh.h> #include <CGAL/Polygon_mesh_processing/compute_normal.h> #include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h> #include <fstream> #include <iostream> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_3 Point; typedef K::Vector_3 Vector; typedef CGAL::Surface_mesh<Point> Surface_mesh; typedef boost::graph_traits<Surface_mesh>::vertex_descriptor vertex_descriptor; typedef boost::graph_traits<Surface_mesh>::face_descriptor face_descriptor; namespace PMP = CGAL::Polygon_mesh_processing; int main(int argc, char* argv[]) { const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/eight.off"); Surface_mesh mesh; if(!PMP::IO::read_polygon_mesh(filename, mesh)) { std::cerr << "Invalid input." << std::endl; return 1; } auto vnormals = mesh.add_property_map<vertex_descriptor, Vector>("v:normals", CGAL::NULL_VECTOR).first; auto fnormals = mesh.add_property_map<face_descriptor, Vector>("f:normals", CGAL::NULL_VECTOR).first; PMP::compute_normals(mesh, vnormals, fnormals); std::cout << "Vertex normals :" << std::endl; for(vertex_descriptor vd: vertices(mesh)) std::cout << vnormals[vd] << std::endl; std::cout << "Face normals :" << std::endl; for(face_descriptor fd: faces(mesh)) std::cout << fnormals[fd] << std::endl; return 0; }
|
VTK可视化法向量