2016-07-26 10 views
-4

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

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

Это то, что я получил: From this

To this

+1

это вопрос только по математике и имеет мало общего с C++ или matlab (если вам не нужен код для любого из двух, в этом случае вы должны показать, что вы уже пробовали) – user463035818

+0

btw это очень простая геометрия. z нормальна к треугольнику и двум другим направлениям, которые вы просто выбираете, чтобы лежать на треугольнике. В чем проблема? – user463035818

+0

Установите 'Z' на' 0' на всех, и вы получите преобразование из 3D в 2D. И если вы хотите преобразовать координаты в новую (0,0) систему, которая находится на (2, 2), например, тогда вам нужно вычесть (2,2) из ​​всех и всех других координат. Тогда результатом будет новая (0,0) система. Не могли бы вы сейчас показать некоторые [MCVE]? –

ответ

2

Проблема может быть выражена как найти матрицу 3 на 3 M таким образом, что координаты точки P могут быть преобразованы между старой координатой te (P_old, 3 строки) и новая система координат (P_new, 3 строки). Это аффинное преобразование:

P_old = Center + M * P_new  (1) 

The (матрица-вектор) умножение с M ориентирует его обратно к старой системе, и добавление Center «s координаты переводит его обратно в старом происхождение.

Уравнение (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 означает квадрат, не XOR):

      || 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| 
      

Тогда M можно рассматривать как |V1 V2 V3| (каждый Vx находится на 3 строк), а затем его обратный вычисляется для используйте формулу (2).

Это преобразование (с инвертированным M) должно генерировать новые координаты для точек на плоскости треугольника, которые имеют 0 на третьей оси (что делает ее 2D-координаты на этой плоскости) и сохраняют размер в члены евклидовой нормы.

+0

Где 'x^2' означает' Pow (x, 2) ', а не' x xor 2' –

+0

Да, спасибо за точность @FirstStep. Я отредактировал ответ. –

+0

Спасибо, я попробовал ваше решение и поработал, чтобы получить «Z» координаты всех точек, значительно равных, но не 0. Также мой треугольник изменился. Может, я сделал что-то не так? Я отредактировал свой вопрос и добавил код Matlab и несколько фотографий. – supporteriukas