У меня есть глобальная система координат (X, Y, Z) и треугольник с точками (A, B, C и центр). Я знаю все координаты этих точек.
>> 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
Проблема может быть выражена как нахождение матрицы 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
означает квадрат, а не исключающее):
|| 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-координатами на этой плоскости), так и сохранять размер с точки зрения евклидовой нормы ,
Других решений пока нет …