xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From thomas.dewe...@kodak.com
Subject RE: Extracting information from a transformation matrix
Date Thu, 08 Jun 2006 11:57:28 GMT
Hi Michael,

"Bishop, Michael W. CONTR J9C880" <Michael.Bishop@je.jfcom.mil> wrote on 
06/07/2006 03:31:12 PM:

> public static double[] getRotationAngle(AffineTransform inTransform) {
> double tx = Math.atan2(inTransform.getShearX(),
> inTransform.getScaleX());
> double ty = Math.atan2(inTransform.getShearY(),
> inTransform.getScaleY());

   I suspect these may need some tweaking. 
I don't have the time to sit down and sort the trig 
out exactly but I suspect I used ShearX when I should
have used ShearY, so something like:

double rx = Math.atan2(inTransform.getShearY(), inTransform.getScaleX());
double ry = Math.atan2(-inTransform.getShearX(),inTransform.getScaleY());

   but really you should pull out your old Trig Texts 
to sort this out.

> AffineTransform affineTransform = new AffineTransform(1, 0, 0, 1, 0 ,0);
> affineTransform.translate(10, 10);
> affineTransform.scale(2, 2);
> affineTransform.rotate(60);

    Like most computer languages (and real math people) the
value to rotate is in radians (2*PI rad = 360 deg).  Since
this wraps every 2PI the above value is really ~3.451 which
is -2.83185... if you map it in the range -PI to PI.

> double[] rotation =
> AffineTransformUtil.getRotationAngle(affineTransform);
> System.out.println("Rotation X: " + rotation[0]);
> System.out.println("Rotation Y: " + rotation[1]);
> }
> 
> I get unexpected results:
> 
> Rotation X: 2.831853071795865
> Rotation Y: -2.831853071795865

   This is close to the expected results, perhaps
the above fix with sort the rest of it out...

> 
> I thought in this case with uniform scaling, I'd see 60.
> If I have non-uniform scaling, how do I represent two different rotation
> angles (x and y) in the transform attribute?  I don't understand how
> rotate(t, cx, cy) breaks down into two values for rotate.
> 
> Michael Bishop
> 
> -----Original Message-----
> From: thomas.deweese@kodak.com [mailto:thomas.deweese@kodak.com] 
> Sent: Tuesday, June 06, 2006 8:39 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/06/2006 08:28:55 PM:
> 
> > I'm confused...why do you call it "rotX"? 
> > Isn't there only a single rotation angle?
> 
>    Not in the presence of shear.  Take the simple example of shearY:
> 
> +------+         +------+
> |      |   ->   /       /
> +------+       +-------+
> 
>    Note that a vector aligned with the x-axis will experience no
> rotation.  However a vector aligned with the y-axis will experience
> rotation.  This is why I called the above value 'rotX' it is
> the rotation of a vector aligned on the x-axis.
> 
>    If you don't have shear or non-uniform scaling (which can make
> some of a normal rotation "look like" shear), this BTW is your
> case, then rotX and the similar 'rotY' calculation will match.
> 
> 
> 
> > ________________________________
> > 
> > From: thomas.deweese@kodak.com [mailto:thomas.deweese@kodak.com]
> > Sent: Tue 6/6/2006 7:46 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/06/2006 01:39:25 PM:
> > 
> > > 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
> > 
> >    The code there doesn't look right to me.  In particular
> > the calculation of konst1 is using tansky which is known to
> > be zero.  I can't say this is 100% wrong (it may simply be
> > to reduce 'unknowns').
> > 
> >    I would simply use:
> > 
> >         double rotX = Math.atan2(at.getShearX(), at.getScaleX());
> > 
> >    I'm fairly sure I have scaleX/shearX in the right place.
> > 
> > > 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
> > >
> > 
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> > For additional commands, e-mail:
> batik-users-help@xmlgraphics.apache.org
> > 
> > 
> > [attachment "winmail.dat" deleted by Thomas E. DeWeese/449433/EKC] 
> > ---------------------------------------------------------------------
> > 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