两个坐标系之间的点CGAL变换

A point CGAL transformation between two coordinate systems

本文关键字:CGAL 变换 之间 坐标系 两个      更新时间:2023-10-16

使用CGAL,如何确定点从一个系统到另一个系统的坐标?假设我们有:

Point p1(1.0, 1.0, 1.0);  

其在由向量确定的典型坐标系中表示:

Vector vx1(1.0, 0.0, 0.0);  
Vector vy1(0.0, 1.0, 0.0);  
Vector vz1(0.0, 0.0, 1.0);  

表示坐标轴。现在取另一个系统的坐标轴的矢量,如何确定p1在该系统中的坐标?

Vector vx2(1.0, -1.0, -1.0);  
Vector vy2(-1.0, 1.0, -1.0);  
Vector vz2(1.0, 1.0, 0.0);  

我想我必须确定一个矩阵,以便将其传递给CGAL::Aff_transformation_3的对象,但我不知道如何。

Vector p2 = p1.transform(??);  

有什么建议吗?

经过一番研究,我在这里找到了解决问题的理论。https://en.wikipedia.org/wiki/Change_of_basis

为了澄清一点,构建这些定义的目的是让代码更容易理解。

typedef CGAL::Cartesian<long double>   KC;
typedef KC::Point_3                    Point;
typedef KC::Vector_3                   Vector;
typedef CGAL::Aff_transformation_3<KC> Transform3;

在考虑了上述因素后,建立了如下仿射变换:

Transform3 tr3(
    vx2.x(), vx2.y(), vx2.z(),
    vy2.x(), vy2.y(), vy2.z(),
    vz2.x(), vz2.y(), vz2.z());

然后,用这个变换对象,我可以得到所需系统中一个点的坐标:

Point p1_out = p1.transform (tr3);

谢谢!

在基B1中有一个向量p1,在基B2中寻找一个向量p2,它是的解

M*p2=p1

其中基从B1变化到B2的M矩阵。M的行是基B2的矢量在基B1中的坐标。因此,你必须反转M,并将其乘以p1,才能找到p2:

p2=M^-1*p1

如果要使用CGAL::Aff_transformation_3,则必须使用Class_2<内核>几何对象,例如Point_3和Vector_3:

typedef CGAL::Cartesian<double> K;

在main()函数中:

K::Vector_3 vx2(1.0, -1.0, -1.0), vy2(-1.0, 1.0, -1.0), vz2(1.0, 1.0, 0.0);
K::Point_3 p1(1.0, 1.0, 1.0);
CGAL::Aff_transformation_3<K> M(vx2.x(),vx2.y(),vx2.z(),vy2.x(), vy2.y(), vy2.z(),vz2.x(), vz2.y(), vz2.z());
K::Point_3 p2=p1.transform(M.inverse());