使用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(??);
任何提示?
答案 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
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());