On 10/8/2013 10:36 PM, Christian Gollwitzer wrote: > Dear John, > > Am 09.10.13 07:28, schrieb John Nagle: >> This is the basic transformation of 3D graphics. Take >> a 3D point, make it 4D by adding a 1 on the end, multiply >> by a transformation matrix to get a new 4-element vector, >> discard the last element. >> >> Is there some way to do that in numpy without >> adding the extra element and then discarding it? >> > > if you can discard the last element, the matrix has a special structure: > It is an affine transform, where the last row is unity, and it can be > rewritten as > > A*x+b > > where A is the 3x3 upper left submatrix and b is the column vector. You > can do this by simple slicing - with C as the 4x4 matrix it is something > like > > dot(C[0:3, 0:3], x) + C[3, 0:3] > > (untested, you need to check if I got the indices right) > > *IF* however, your transform is perspective, then this is incorrect - > you must divide the result vector by the last element before discarding > it, if it is a 3D-point. For a 3D-vector (enhanced by a 0) you might > still find a shortcut.
I only need affine transformations. This is just moving the coordinate system of a point, not perspective rendering. I have to do this for a lot of points, and I'm hoping numpy has some way to do this without generating extra garbage on the way in and the way out. I've done this before in C++. John Nagle -- https://mail.python.org/mailman/listinfo/python-list