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

时间:2014-04-24 13:26:09

标签: c++ transformation cgal

使用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(??);  

任何提示?

2 个答案:

答案 0 :(得分:3)

嗯,经过一番研究,我在这里找到了解决问题的理论。 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);

谢谢!

答案 1 :(得分:0)

您有一个基于b1的向量p1,并且您正在寻找一个基于b2的向量p2,它是以下项的解决方案:

M * p2 = p1

具有从B1到B2的基础变化的M矩阵。 M的行是基准B1中的基准B2的矢量的坐标。因此,您必须将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());