У вас есть 4 некомпланарных точки в исходной системе (где lx
- длина первого вектора и т. Д.):
(0,0,0), (lx,0,0), (0,ly,0), (0,0,lz)
и их двойники в новой системе
[ox, oy, oz]
[oxx + ox, oxy + oy, oxz + oz]
[oyx + ox, oyy + oy, oyz + oz]
[ozx + ox, ozy + oy, ozz + oz]
Матрица аффинного преобразования A должна преобразовать начальные точки в их пары точек
A * P = P'
сделать матрицу с векторами столбцов точек:
|x1 x2 x3 x4| |x1' x2' x3' x4'|
A *|y1 y2 y3 y4| = |y1' y2' y3' y4'|
|z1 z2 z3 z4| |z1' z2' z3' z4'|
|1 1 1 1| |1 1 1 1|
|0 lx 0 0| |ox oxx + ox . .|
A *|0 0 ly 0| = |oy oxy + oy . .| // lazy to make last columns
|0 0 0 lz| |oz oxz + oz . .|
|1 1 1 1| |1 1 1 1|
Для вычисления A необходимо умножить обаsudes by reverse P matrix
A * P * P-1 = P' * Pinverse
A * E = P' * Pinverse
A = P' * Pinverse
Итак, вычислите обратную матрицу для P и умножьте ее на правую матрицу.
Редактировать: обратная матрица, вычисленная Maple, равна
[[-1/lx, -1/ly, -1/lz, 1],
[1/lx, 0, 0, 0],
[0, 1/ly, 0, 0],
[0, 0, 1/lz, 0]]
И результирующая матрица аффинного преобразования имеет вид
[[-ox/lx+(oxx+ox)/lx, -ox/ly+(oyx+ox)/ly, -ox/lz+(ozx+ox)/lz, ox],
[-oy/lx+(oxy+oy)/lx, -oy/ly+(oyy+oy)/ly, -oy/lz+(ozy+oy)/lz, oy],
[-oz/lx+(oxz+oz)/lx, -oz/ly+(oyz+oz)/ly, -oz/lz+(ozz+oz)/lz, oz],
[0, 0, 0, 1]]
Просмотр листа клена для справки
Редактировать:
Только что заметили:Maple не удаляет излишние слагаемые, поэтому результат должен быть проще:
[[(oxx)/lx, (oyx)/ly, (ozx)/lz, ox],
[(oxy)/lx, (oyy)/ly, (ozy)/lz, oy],
[(oxz)/lx, (oyz)/ly, (ozz)/lz, oz],
[0, 0, 0, 1]]