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).

 

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.

 

What I do in my class that represents elements, however, is store an AffineTransform:

 

String transformValue = element.getAttribute(SVGConstants.SVG_TRANSFORM_ATTRIBUTE);

AffineTransform affineTransform = AWTTransformProducer.createAffineTransform(transformValue);

 

Then store class variables from the AffineTransform:

 

Double translateX = new Double(affineTransform.getTranslateX());

 

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.

 

Michael Bishop

 

 


From: Bishop, Michael W. CONTR J9C880 [mailto:[EMAIL PROTECTED]
Sent: Wednesday, December 07, 2005 1:15 PM
To: [email protected]
Subject: RE: Scaling around a center point...

 

…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