
On January 9, 2011 at 4:03 PM Bryan Hoyt | Brush Technology <bryan@...2542.....> wrote:
Briefly, to get the x,y position of a point after it's transformed, use a function like this (in Python):
def transform_point(transform, x, y): x = transform[0][0]*x + transform[0][1]*y + transform[0][2] y = transform[1][0]*x + transform[1][1]*y + transform[1][2] return x,y
Sorry, as much as i've tried (given time constraints), I can't figure out where you got the above 2x3 matrix instead of a 2x2. Or is it a 2x3 python array, whose (top)-left 2x2 elements are the rotation transformation? In that case, where do you get transform[0][2] and transform[1][2] from?
If you need to modify the x,y position, it gets slightly more complicated,
but only a little. 1) transform the point as above, to get the original values if you need them for anything 2) calculate the new values you need. 3) Transform them back to the original x,y space by using the matrix inverse: http://en.wikipedia.org/wiki/Matrix_inverse
You mean, given a certain non-origin position, multiplying by the inverse would give me that position. (note, I am saying "ORIGIN" (0,0), not "original" :-))
In pseudo-code:
orig_x, orig_y = however_you_got_the_values_in_the_first_place() t_x, t_y = transform_point(transform, orig_x, orig_y) new_x_t, new_y_t = calculate_some_new_values(t_x, t_y) new_x, new_y = transform_point(invert_transform(transform), new_x_t,
new_y_t)
To get the matrix inverse isn't 100% straightforward, mathematically. It's easy in python, though. Here's the function I use (pretty much just a wrapper around numpy.matrix.I):
you are making me think back years ago to linear algebra class... yes, I suspected from the getgo I might need the inverse at some point. thanks again
import numpy
def invert_transform(transform): transform = transform[:] # duplicate list to avoid modifying it transform += [[0, 0, 1]] inverse = numpy.matrix(transform).I.tolist() inverse.pop() return inverse
- Bryan
On Mon, Jan 10, 2011 at 09:26, Bric <bric@...2538...> wrote:
On January 9, 2011 at 2:21 PM Bryan Hoyt | Brush Technology < bryan@...2310...> wrote:
Hi Bric,
Yes, you're correct. The x/y values are being translated, scaled,
rotated,
and/or sheared by the transform matrix. These pages on Wikipedia should
help
you to get started:
http://en.wikipedia.org/wiki/Transformation_(geometry)
Yes, I am using the (cos, sin, -sin, cos) rotation matrix in my script, and inkscape seems to visualize my rotation angle the way i intend. But, as is the issue, not the x/y position of my intent.
OK. Thanks for this info. At this point I can only vaguely understand how (and why) inkscape would store transformed values in the SVG file, instead of storing the original coordinates and then subjecting those to whatever transformation the applies, during render time. I'll have to get back to this later.
Also, it's not just the transform matrix on the object itself that you
need
to think about. If the text object is part of a group or a layer, then if there's a transform matrix on any of its parent groups or layers, they'll affect the object cumulatively.
thanks.
I've written Python code to handle all these scenarios in the Pixelsnap
extension. Have a look at the code for that if you want.
I skimmed through your code, and see that you are computing offsets based on transformation. Still, it looks complex for me right now; will have to return to it later when I have more time.
I can't wrap my mind around how exactly to apply the transformation to the x y position. I'll tinker with this later.
thanks again
-- PS. Check out the Brush newsletter: *Subscribe or read our previous newsletters* http://brush.co.nz/newsletters
Bryan Hoyt, *Web Development Manager* -- Brush Technology *Ph:* +64 3 741 1204 *Mobile:* +64 21 238 7955 *Web:* brush.co.nz