Как да извършим декартова трансформация

Карам се да вярвам, че имам нужда от декартова трансформация, но не съм сигурен. Тук е моят проблем.

Имам две координатни системи, една глобална x,y,z, друга локална i,j,k, която съществува вътре в x,y,z

Знам местоположението на началната точка на локалната система вътре в глобалната. Нека го обозначим с B.

Познавам още две точки C и E по оста i и j. Което означава, че моята i може да бъде определена от правата BC, а оста j от правата BE. Оста k ще бъде перпендикулярна на 2D план i,j

Как да преведа координатите на една система в друга.

Например да кажем, че знам D{x,y,z}, знам, че D съществува в локалната координатна система, как да получа D{i,j,k}? Освен това как да се върна в другата посока?

Как да: D{x,y,z} ‹-> D{i,j,k}


person user1611172    schedule 06.08.2015    source източник
comment
Ако имате нужда от помощ по математика, попитайте в съответния сайт за математика.   -  person Bathsheba    schedule 06.08.2015


Отговори (1)


Афинната трансформация се определя от 3×1 транслационен вектор B и 3×3 ротационна матрица E. Сега искате да вземете локална точка P=(i_P,j_P,k_P) и да я трансформирате в глобална точка P'=(x_P,y_P,z_P). Това се прави от

    P' = B + E * P
  1. Преводът е прост, B=(B_x, B_y, B_z)
  2. Матрицата на въртене се дефинира като глобалните координати на единичните вектори i, j и k като трите колони на матрицата.

        | i_x  j_x  k_x |
    E = | i_y  j_y  k_y |
        | i_z  j_z  k_z |
    

За да намерите тези компоненти, използвайте координатите на точки B=(B_x, B_y, B_z), C=(C_x, C_y, C_z) и E=(E_x, E_y, E_z)

  1. Вземете разликата между C и B и я направете единичен вектор за i. Намерете разстоянието между тях като

    d_BC = sqrt( (B_x-C_x)^2 + (B_y-C_x)^2 + (B_z-C_z)^2 );
    

    и компонентите са:

    i_x = (C_x-B_x)/d_BC;
    i_y = (C_y-B_y)/d_BC;
    i_z = (C_z-B_z)/d_BC;
    
  2. Вземете разликата между E и B и я направете единичен вектор за j. Намерете разстоянието между тях като

    d_BE = sqrt( (B_x-E_x)^2 + (B_y-E_x)^2 + (B_z-E_z)^2 );
    

    и компонентите са:

    j_x = (E_x-B_x)/d_BE;
    j_y = (E_y-B_y)/d_BE;
    j_z = (E_z-B_z)/d_BE;
    
  3. Компонентите на k се намират с помощта на векторно кръстосано произведение k = i × j

    k_x = i_y*j_z - i_z*j_y;
    k_y = i_z*j_x - i_x*j_z;
    k_z = i_x*j_y - i*y*j_x;
    

Пълната трансформация е сега

x_P = B_x + i_x*i_P + j_x*j_P + k_x*k_P;
y_P = B_y + i_y*i_P + j_y*j_P + k_y*k_P;
z_P = B_z + i_z*i_P + j_z*j_P + k_z*k_P;

Редактиране 1

Обратната трансформация е

    P = E'*(P'-B)

където E' е транспонирането на матрицата 3×3 E. В съставна форма това е

i_P = i_x*(x_P-B_x) + i_y*(y_P-B_y) + i_z*(z_P-B_z);
j_P = j_x*(x_P-B_x) + j_y*(y_P-B_y) + j_z*(z_P-B_z);
k_P = k_x*(x_P-B_x) + k_y*(y_P-B_y) + k_z*(z_P-B_z);
person John Alexiou    schedule 06.08.2015
comment
Здравей @ja72 Бих искал искрено да ти благодаря за помощта и изключително изчерпателния отговор. Загрижен съм много повече за xyz-›ijk, отколкото обратното, как мога да променя това уравнение за тази цел? Ще проуча информацията ви, за да видя дали мога сам да получа отговора. Исках да ви изпратя ЛС, за да ви благодаря лично и също така да ви уведомя малко повече за проекта, на който сте помогнали, и да видя дали има начин да мога да призная вашия принос. Уви, stackoverflow не позволява такова нещо, така че, моля, не се колебайте да се свържете с мен на [email protected] - person user1611172; 10.08.2015
comment
Вижте редакция за обратната трансформация. Ако смятате, че е така, моля, посочете ме като SO потребител ja72 и свържете към моя профил. - person John Alexiou; 10.08.2015