Точечное преобразование 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(??);  

Какие-нибудь советы?


person Gilberto Cuba    schedule 24.04.2014    source источник


Ответы (2)


Что ж, немного поисследовав, я нашел здесь теорию для решения моей проблемы. 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);

Спасибо!

person Gilberto Cuba    schedule 25.04.2014
comment
Ваше решение хорошее. Я проголосовал за ваш вопрос и ваш ответ. - person lrineau; 25.04.2014
comment
Спасибо @lrineau !! ;) - person Gilberto Cuba; 26.04.2014

У вас есть вектор p1 в базисе B1, и вы ищете вектор p2 в базисе B2, который является решением:

M*p2=p1

с M-матрицей смены базиса с B1 на B2. Строки M являются координатами векторов базиса B2 в базисе B1. Следовательно, вам нужно инвертировать M и умножить его на p1, чтобы найти p2:

p2=M^-1 * p1

Если вы хотите использовать CGAL::Aff_transformation_3, вы должны использовать геометрические объекты Class_2‹Kernel›, например 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());
person Enrico    schedule 11.07.2018