Whew,
The madness certainly has begun. I managed to put something
together based on your suggestions and a little bit of hacking. The
class I wrote tracks move translations and scale translations
separately, but adds them together when setting the attribute back to
the document.
Now another similar question. How can I get rotate information
from the incoming AffineTransform? I can get scaleX/Y and translateX/Y,
but there is no visible way to get rotate information. If my transform
attribute looke like:
transform="translate(x, y) scale(x, y) rotate(t)"
Is there a way to get the value of t?
Michael Bishop
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: Thursday, December 08, 2005 6:03 AM
To: [email protected]
Subject: RE: Scaling around a center point...
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
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]