官方手册阅读
文档函数链接:CGAL 5.5 - Polygon Mesh Processing: Polygon Mesh Processing Reference
transform()
1 2 3 4 5
| template<class Transformation , class PolygonMesh , class NamedParameters = parameters::Default_named_parameters> void CGAL::Polygon_mesh_processing::transform(const Transformation & transformation, PolygonMesh & mesh, const NamedParameters & np = parameters::default_values() )
|
包含头文件:#include <CGAL/Polygon_mesh_processing/transform.h>
函数实现功能:对PolygonMesh
中的每个顶点进行坐标变换。
Parameters |
Details |
transformation |
the transformation functor to apply to the points of mesh . |
mesh |
the PolygonMesh to transform. |
接下来分析一下参数类型:
- Transformation: 一个functor,能够对Point_3进行运算。可以是
CGAL::Aff_transformation_3
。
- PolygonMesh:a model of
VertexListGraph
其中,图概念VertexListGraph
是Boost里Graph概念的细化分支,添加了遍历图形中所有顶点的需求。通过查阅官方文档中CGAL and the Boost Graph Library部分,我们发现网格常用的Surface_mesh Class和Polyhedron Class在CGAL中均提供有部分特化,使其能成为图概念 BidirectionalGraph、VertexAndEdgeListGraph、AdjacencyMatrix 和 MutableFaceGraph
的模型。其中,VertexAndEdgeListGraph
就包括VertexListGraph, EdgeListGraph。
接下来再研究一下另一个参数类型Aff_transformation_3
。
Aff_transformation_3代表了三维空间下的仿射变换。其中使用数字类型 Kernel::RT
(homogeneous齐次坐标系)或者 Kernel::FT
(cartesian笛卡尔坐标系)来表示变换矩阵中的元素。
构造示例
1
| Aff_transformation_3 (const Translation, const Vector_3< Kernel > &v)
|
其中Translation是标记类,代表平移操作(此外还有Rotation、Reflection、Scaling等)。v是平移向量。
创建向Z方向平移的仿射变换。
1
| CGAL::Aff_transformation_3<Kernel>(CGAL::Translation(), Kernel::Vector_3(FT(0), FT(0), FT(1)))
|
1
| Aff_transformation_3 (const Scaling, const Kernel::RT &s, const Kernel::RT &hw=RT(1))
|
缩放大小计算$s/hw$。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template<typename Kernel > CGAL::Aff_transformation_3< Kernel >::Aff_transformation_3 ( const Kernel::RT & m00, const Kernel::RT & m01, const Kernel::RT & m02, const Kernel::RT & m03, const Kernel::RT & m10, const Kernel::RT & m11, const Kernel::RT & m12, const Kernel::RT & m13, const Kernel::RT & m20, const Kernel::RT & m21, const Kernel::RT & m22, const Kernel::RT & m23, const Kernel::RT & hw = RT(1) )
|
从如下矩阵
$$
\small \mbox{(\left(\begin{array}{cccc} m_{00} & m_{01} & m_{02} & m_{03}\ m_{10} & m_{11} & m_{12} & m_{13}\ m_{20} & m_{21} & m_{22} & m_{23}\ 0 & 0 & 0 & hw \end{array}\right))}
$$
构造一个仿射变换。
相关操作
测试代码
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
| #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Aff_transformation_3.h> #include <CGAL/Surface_mesh.h> #include <CGAL/Polyhedron_3.h> #include <CGAL/Polygon_mesh_processing/transform.h> using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; using FT = typename Kernel::FT; using Point_3 = typename Kernel::Point_3; using Vector_3 = typename Kernel::Vector_3; using Polyhedron = CGAL::Polyhedron_3<Kernel>; using Mesh = CGAL::Surface_mesh<Point_3>; using Affine_transformation_3 = CGAL::Aff_transformation_3<Kernel>; namespace PMP = CGAL::Polygon_mesh_processing; int main() { const std::string filepath = "meshes/blobby.off";
Mesh mesh; CGAL::IO::read_OFF(filepath, mesh); Polyhedron polyhedron; CGAL::IO::read_OFF(filepath, polyhedron); CGAL::IO::write_STL("data/blobby.stl", polyhedron, CGAL::parameters::use_binary_mode(false));
Affine_transformation_3 trans(FT(1), FT(0), FT(0), FT(0), FT(0), FT(1), FT(0), FT(0), FT(0), FT(0), FT(1), FT(1)); PMP::transform(trans, polyhedron); CGAL::IO::write_STL("data/blobby_trans.stl", polyhedron, CGAL::parameters::use_binary_mode(false)); return EXIT_SUCCESS; }
|