文档函数链接:CGAL 5.5 - Polygon Mesh Processing: Polygon Mesh Processing Reference
transform()
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
函数实现功能:对PolygonMesh
中的每个顶点进行坐标变换。
Parameters | Details |
---|---|
transformation | the transformation functor to apply to the points of mesh . |
mesh | the PolygonMesh to transform. |
接下来分析一下参数类型:
CGAL::Aff_transformation_3
。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笛卡尔坐标系)来表示变换矩阵中的元素。
Aff_transformation_3 (const Translation, const Vector_3< Kernel > &v)
其中Translation是标记类,代表平移操作(此外还有Rotation、Reflection、Scaling等)。v是平移向量。
创建向Z方向平移的仿射变换。
CGAL::Aff_transformation_3<Kernel>(CGAL::Translation(), Kernel::Vector_3(FT(0), FT(0), FT(1)))
Aff_transformation_3 (const Scaling, const Kernel::RT &s, const Kernel::RT &hw=RT(1))
缩放大小计算 s / h w s/hw s/hw。
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)
)
从如下矩阵
(
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
h
w
)
\left(
构造一个仿射变换。
Aff_transformation_3< Kernel > operator* (const Aff_transformation_3< Kernel > &s) const
重载了乘法运算符(*),可通过
tran1 * tran2
得到两个变换的组合变换。
Aff_transformation_3< Kernel > inverse () const
求逆变换。
#include
#include
#include
#include
#include
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;
}