Преобразование системы координат, 3d проекция на 2d плоскость
У меня есть глобальная система координат (X, Y, Z) и треугольник с точками (A, B, C и центр). Я знаю все координаты этих точек.
- Мне нужно переместить глобальную систему координат из (0; 0; 0) в центр треугольника, чтобы у всех точек: A, B, C и Center были новые координаты, где Z = 0. После этого мне нужно знать новые координаты. из этих точек в связи с новой системой координат. Ориентация новой системы координат не важна.
- Также, если есть возможность преобразовать трехмерные точки (треугольные точки) в двухмерную плоскость без потери ее геометрии (размера). Это не должна быть проекция на 2D плоскость.
>> A=[10.63307; -7.72528; 21.26636];
B=[4.06139; -12.49988; 21.26636];
C=[-6.57172; -20.22529; 13.14344];
Centr=[-4.38113; -13.48349; 18.55872];
>> V1=(B-A)/(norm(B-A))
V1 =
-0.8090
-0.5878
0
>> V2=((C-A)-(dot((C-A),V1)*V1))/(norm((C-A)-(dot((C-A),V1)*V1)))
V2 =
0.0000
-0.0000
-1.0000
>> V3=cross(V1,V2)
V3 =
0.5878
-0.8090
0.0000
>> M=[V1,V2,V3]
M =
-0.8090 0.0000 0.5878
-0.5878 -0.0000 -0.8090
0 -1.0000 0.0000
>> Anew=inv(M)*(A-Centr)
Anew =
-15.5313
-2.7076
4.1666
>> Bnew=inv(M)*(B-Centr)
Bnew =
-7.4083
-2.7076
4.1666
>> Cnew=inv(M)*(C-Centr)
Cnew =
5.7350
5.4153
4.1666
Вот что я получил: от этого
1 ответ
Проблема может быть выражена как нахождение матрицы 3 на 3 M
такие, что координаты точки P
можно конвертировать между старой системой координат (P_old
, 3 строки) и новая система координат (P_new
, 3 ряда). Это аффинное преобразование:
P_old = Center + M * P_new (1)
(Матрица-вектор) умножение с M
ориентирует его обратно на старую систему и добавляет Center
координаты переводит его обратно в старое происхождение.
Уравнение (1) можно затем преобразовать в:
P_new = M^{-1} * (P_old - Center) (2)
где M^{-1}
обратная M
, чтобы вычислить новые координаты из старых (третья строка будет иметь 0, если точка принадлежит плоскости треугольника).
Матрица M
состоит из координат нового базиса в старой системе, по одному базисному вектору в каждом столбце. Теперь нужно найти такую основу.
Эту основу можно взять из (это все псевдокод):
перенормировки
AB
AB V1 = ______ || AB ||
AB
здесь подразумевается как векторAB
(со стрелкой сверху):|b_x - a_x| |b_y - a_y| |b_z - a_z|
|| . ||
евклидова норма (^2
означает квадрат, а не xor):|| V || = sqrt(V_x^2 + V_y^2 + V_z^2)
AC
(также вектор, определенный какAB
), но минус его проекция наV1
сделать это ортогональным кV1
и перенормировать (это будет невозможно с делением на ноль, если треугольник на самом деле не является треугольником):AC - (AC.V_1) V1 V2 = _______________________ || AC - (AC.V_1) V1 ||
M.N
скалярное произведение:M.N = M_x * N_x + M_y * N_y + M_z * N_z
(AC.V_1) V1
это просто скалярное произведение,(AC.V_1)
с вектором,V1
Третий вектор, который можно взять в качестве перекрестного произведения для получения декартовой системы координат:
V3 = V1 x V2
Совокупный продукт определяется как:
|V1_y*V2_z - V1_z*V2_y| V1 x V2 = |V1_z*V2_x - V1_x*V2_z| |V1_x*V2_y - V1_y*V2_x|
Тогда М можно принять как |V1 V2 V3|
(каждый Vx
на 3 строки), а затем обратное вычисление с использованием формулы (2).
Это преобразование (с инвертированным M) должно как генерировать новые координаты для точек на плоскости треугольника, которые имеют 0 на третьей оси (что делает его 2D-координатами на этой плоскости), так и сохранять размер с точки зрения евклидовой нормы,