Преобразование системы координат, 3d проекция на 2d плоскость

У меня есть глобальная система координат (X, Y, Z) и треугольник с точками (A, B, C и центр). Я знаю все координаты этих точек.

  1. Мне нужно переместить глобальную систему координат из (0; 0; 0) в центр треугольника, чтобы у всех точек: A, B, C и Center были новые координаты, где Z = 0. После этого мне нужно знать новые координаты. из этих точек в связи с новой системой координат. Ориентация новой системы координат не важна.
  2. Также, если есть возможность преобразовать трехмерные точки (треугольные точки) в двухмерную плоскость без потери ее геометрии (размера). Это не должна быть проекция на 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

-3

Решение

Проблема может быть выражена как нахождение матрицы 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 состоит из координат нового базиса в старой системе, по одному базисному вектору в каждом столбце. Теперь нужно найти такую ​​основу.

Эту основу можно взять из (это все псевдокод):

  1. перенормировки 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)
      
  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

  3. Третий вектор, который можно взять в качестве перекрестного произведения для получения декартовой системы координат:

    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-координатами на этой плоскости), так и сохранять размер с точки зрения евклидовой нормы ,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector