# xmlgraphics-batik-users mailing list archives

##### Site index · List index
Message view
Top
From "Bishop, Michael W. CONTR J9C880" <Michael.Bis...@je.jfcom.mil>
Subject RE: Extracting information from a transformation matrix
Date Tue, 06 Jun 2006 17:39:25 GMT
```OK, I'm still struggling with this.  I'm trying to derive the rotation
angle using the MatrixReverse function here:

http://www.datenverdrahten.de/svglbc/?code=matrix_reverse&znr=on

Here's my test code:

AffineTransform affineTransform = new AffineTransform(1, 0, 0, 1, 0, 0);
affineTransform.translate(10, 10);
affineTransform.scale(2, 2);
System.out.println("Transform: " + affineTransform);
System.out.println(
"Angle: " +
AffineTransformUtil.getRotationAngle(affineTransform));
affineTransform.rotate(60);
System.out.println(
"Angle: " +
AffineTransformUtil.getRotationAngle(affineTransform));

The first time, the angle is reported as 0.0 which is correct.  The
second time, it's reported as 17.746...which is not.  I'm under the
impression it should be 60.  Anyone know how/why this (doesn't) work?

Michael Bishop

-----Original Message-----
From: Bishop, Michael W. CONTR J9C880
[mailto:Michael.Bishop@je.jfcom.mil]
Sent: Monday, June 05, 2006 1:49 PM
To: batik-users@xmlgraphics.apache.org
Subject: RE: Extracting information from a transformation matrix

Well I'm trying to integrate this side-by-side with what's already
there.  So when I print out the attributes, I print out the "transform"
attribute and I print out the dummy "matrix" attribute
(matrix="matrix(a, b, c, d, e, f)".

The problem is that if I translate, things are fine.  If I scale, things
are fine.  If I scale, then translate, the "matrix" numbers don't match
the "transform".  In order to get them to match up, I've been "undoing"
everything:

(For translation)

transform.scale(1.0d / sx, 1.0d / sy);
transform.translate(tx, ty);
transform.scale(sx, sy);

In order to make the numbers "match", I have to do all my translations
"first" before scaling.  This kind of makes sense; when I use the
transform attribute, I always start from scratch: translate(tx, ty)
scale(sx, sy) rotate(t).

I see the "preConcatenate" method here in the JDK, so let's go back to
my use case.  I want to be able to translate, rotate, and scale in any
order.  The user could draw an element, scale it by 150%, rotate it 60
degrees, drag it to the left, scale down to 50%, etc.

I'm not sure how preconcatenating will help because I don't know when to
do it and when not to.  I need to preconcatenate before any scaling
operations I think.  Rotate just makes it even tougher.

Michael Bishop

-----Original Message-----
From: thomas.deweese@kodak.com [mailto:thomas.deweese@kodak.com]
Sent: Monday, June 05, 2006 1:38 PM
To: batik-users@xmlgraphics.apache.org
Cc: batik-users@xmlgraphics.apache.org
Subject: RE: Extracting information from a transformation matrix

Hi Michael,

"Bishop, Michael W. CONTR J9C880" <Michael.Bishop@je.jfcom.mil> wrote on

06/05/2006 12:12:15 PM:

> Am I correct in assuming that:
>
> transform(tx, ty) scale(sx, sy)
>
> and
>
> sx  0  tx
> 0   sy ty
>
> will hold identical values for sx, sy, tx, and ty for any values of
> those variables?  In other words, no matter how I scale/translate or
in
> what order, should it matter?  Note that no rotation has been
> introduced.

Order does matter. So scale then translate is different from
translate then scale.  However since you are manipulating the
transform on one element you can play some games by choosing to
pre or post multiply the various transforms.  So if you always
post multiply the translate transform (preconcatenate in JDK
terms) then the translate part will just be 'added' to the
existing matrix.  This is probably what you want for translate
(from what I recall of how you handle things).

>
> Michael Bishop
>
> -----Original Message-----
> From: Bishop, Michael W. CONTR J9C880
> [mailto:Michael.Bishop@je.jfcom.mil]
> Sent: Friday, June 02, 2006 12:32 PM
> To: batik-users@xmlgraphics.apache.org
> Subject: RE: Extracting information from a transformation matrix
>
> Good, good...OK, now I'm getting an understanding and figuring out
what
> needs to be done.  I assume the 6 values are represented as:
>
> a b c
> d e f
> 0 0 1 (implied, I know we don't really care about these values)
>
> According to my reference, to do a translation, I would have to
multiply
> in the following:
>
> 1 0 tx
> 0 1 ty
> 0 0 1 (again, implied)
>
> A scale:
>
> sx  0   0
> 0   sy  0
> 0   0   1 (implied for consistency's sake)
>
> A rotate:
>
> cos(t) -sin(t) 0
> sin(t)  cos(t) 0
> 0       0      1 (blah blah)
>
> To get this done in code:
>
> AffineTransform affineTransform = new AffineTransform(a, b, c, d, e,
f);
> SVGMatrix svgMatrix = new SVGOMMatrix(affineTransform);
>
> Besides the obvious way of calling getA(), getB(), etc., is there a
way
> to turn this into the proper attribute?
>
> transform="matrix(a, b, c, d, e, f)"
>
> Michael Bishop
> -----Original Message-----
> From: Andrew Plotkin [mailto:erkyrath@eblong.com]
> Sent: Friday, June 02, 2006 12:20 PM
> To: batik-users@xmlgraphics.apache.org
> Subject: RE: Extracting information from a transformation matrix
>
> On Fri, 2 Jun 2006, Bishop, Michael W. CONTR J9C880 wrote:
>
> > I don't care how it looks at all.  I don't need to present
information
> > to the user.  I can store the 6 values and keep it that way.
>
> Ok.
>
> > But realistically, if I wanted to rotate around a center point, I'd
> > translate to the center point, perform the rotation, then
> "untranslate"
> > to the center point.  Does Batik assist with these calculations?
>
> The SVGMatrix interface has a multiply(SVGMatrix) method.
>
> > Am I even on the right
> > track here in that every operation I want to do is a new
> multiplication?
>
> Yes, that's right.
>
> > After I rotate, if I want to translate again, do I have to "undo"
> > anything or just multiply in a new (tx, ty)?
>
> Just multiply in a new one.
>
> --Z
>
> --
> "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the
> borogoves..."
> *
> If the Bush administration hasn't subjected you to searches without a
> warrant,
> it's for one reason: they don't feel like it. Not because you're
> innocent.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail:
batik-users-help@xmlgraphics.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail:
batik-users-help@xmlgraphics.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail:
batik-users-help@xmlgraphics.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org

```
Mime
View raw message