Hi Michael,

"Bishop, Michael W. CONTR J9C880" <[EMAIL PROTECTED]> wrote on 
12/07/2005 01:56:24 PM:

> Now this is getting more complicated.  The second time I scale an 
element, it 
> moves because the translation value is appended.  This is tough to 
explain. 
> Let’s say the center point is 100,100.  If I scale to 2x, I add a 
translation 
> by (-100 * 1), (-100 * 1).  My new translation value is (-100, -100). 
Now if 
> I scale to 3x, I add a translation by (-100 * 2), (-100 * 2).  My new 
> translation value is (-300, -300).  This is wrong.  Why?  Because it 
doesn’t 
> take the first scale into effect!  If I started at a scale factor of 1.0 
and 
> scaled directly to 3x, my new translation value would be (-200, -200).

    You need to multiply your new scale matrix by your old scale matrix to
get your new scale/transform matrix.  If you do this your new translate
will be multiplied by the previous scale factor giving you: 
        -100*2*2 + -100 = -500 which I think is right for a 6x scale.

> To summarize, I need to keep translations appended by moving the element 

> RELATIVE to the previous value and I need to keep translations by 
scaling the 
> element ABSOLUTE:
> 
> transform=(translate(mx, my) translate(sx, sy) scale(x, y))
> 
> Where (mx,my) is the move translation (incremented based on movement), 
(sx, 
> sy) is the scale translation (set based on scale factor) and (x, y) is 
the scale factor.
> 
> So far so good.

    This is the path to madness ;)  You need to setup the code so it 
doesn't
care why it has a translate (be it for translate or for scaling) it just 
has
one.

> The problem is that if I use the above transform attribute, I need to 
retrieve
> TWO translate values from the AffineTransform; one for movement, one for 

> scaling.  How can I do this?  If I can’t, how can I “parse” an incoming 
> element into the various values?  The reason I switched to an 
AffineTransform 
> was to avoid using string parsing to get the various bits I need.

    If you look under the hood of the AWTTransformProducer there is a
parser and a handler.  The handler get's called back when the parser
handles major pieces of the transform attribute (like the 'translate'
or 'scale' pieces).

> …nevermind, that’s not how you get center X/Y.  Now it stays put for the 
most 
> part; I’m getting random incorrect translations that I haven’t been able 
to solve yet.
> 
> Michael Bishop
> 
> 
> From: Bishop, Michael W. CONTR J9C880 
[mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, December 07, 2005 12:44 PM
> To: [email protected]
> Subject: Scaling around a center point...
> 
> More transform issues!  As you may recall, I add a translate value to 
move 
> objects around the canvas.  Now I’m working on scaling and I like the 
scale to
> be uniform around the center of element.  I get the center point by 
asking the
> Element for its bounding box:
> 
> centerX = boundingBox.getWidth() – boundingBox.getX();
> centerY = boundingBox.getHeight() – boundingBox.getY();
> 
> In the SVG Essentials book I have, it says to scale around a center 
point, the
> translate should be set to:
> 
> translate(-centerX * (factor – 1), -centerY * (factor – 1))
> 
> Instead of setting the above, I ADD the above to the existing translate 
if one
> exists.  However, when I scale, the element stays nowhere near the 
center 
> point.  I tried simply SETTING the translate values, losing the previous 
ones 
> and it’s still wrong.  Is there a better technique for scaling around 
the 
> center of an element, or is my math just wrong somewhere?
> 
> Michael Bishop

Reply via email to