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