Добавьте 4-ю строку к Tform
со значениями 0 0 0 1
, то есть последней строкой единичной матрицы:
>>> m = np.vstack(Tform, np.array([0,0,0,1]))
>>> m
array([[ 4.00e+03, 0.00e+00, -1.60e+03, -8.00e+03],
[ 5.00e+02, 5.00e+03, 8.68e+02, -8.00e+03],
[ 5.00e-01, 0.00e+00, 8.00e-01, -8.00e+00],
[ 0.00e+00, 0.00e+00, 0.00e+00, 1.00e+00]])
Обратите внимание, что вы не можете использовать append
, потому что это такжевыравнивает входные массивы.
Обратите внимание, что при умножении на old
четвертый компонент результата равен 1, т. е. результат равен np.append(newpoint, 1)
:
>>> np.dot(m, old)
array([ 3.0400e+04, -2.7132e+04, -2.2000e+00, 1.0000e+00])
----------
Следовательно, XXX
является обратным этой новой матрицы:
>>> XXX = np.linalg.inv(m)
>>> np.dot(XXX, np.append(newpoint, 1))
array([10., -5., 1., 1.])
-------------
И мы получаем компоненты old
обратно.
В качестве альтернативы вы можете вычесть 4-й столбец Tform
из newpoint
и умножить результат на инверсию левой подматрицы 3x3 Tform
, но это немного неудобно, поэтому мы можем также позволить numpy
сделатьбольше работы :) 1030 *