【CGAL_网格处理】坐标变换

官方手册阅读

文档函数链接: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 <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笛卡尔坐标系)来表示变换矩阵中的元素。

构造示例
  • 平移
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

  • 4×4矩阵构造
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(\\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)

m00m10m200m01m11m210m02m12m220m03m13m23hw


构造一个仿射变换。

相关操作
  • Aff_transformation_3< Kernel > operator* (const Aff_transformation_3< Kernel > &s) const
    

    重载了乘法运算符(*),可通过tran1 * tran2得到两个变换的组合变换。

  • Aff_transformation_3< Kernel > inverse () const
    

    求逆变换。

测试代码

#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;
}

image-20220815104231530在这里插入图片描述

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片