Hi Michael,

"Bishop, Michael W. CONTR J9C880" <[EMAIL PROTECTED]> wrote on 
10/03/2008 02:53:06 PM:

> > parl_to_parl takes two double[] src and dst as arguments.  The 
> > method maps one parallelogram to another, but
> > why does each double[] have 6 points?  What is being passed in 
> > here, a transform or a parallelogram?  The rest of
> > the code makes sense.
> 
> I might've answered my own question here by looking around for 
> examples of the "three point" method.  I forgot that each point has 
> two coordinates.  I believe that the double[] of src (and dst) are:
> 
> { x1, y1, x2, y2, x3, y3 }

   Correct.

> which is mapped into an AffineTransform (at) as such:
> 
> (x2 - x1) (y2 - y1) (x3 - x1)
> (y3 - y1) (x1     ) (y1     )
> 0         0         1

   This isn't a proper representation of their matrix.
They store it as:
        sx, shy
        shx, sy
        tx , ty

   So it's:
        (x2 - x1) (y2 - y1)  0
        (x3 - x1) (y3 - y1)  0
        (x1     ) (y1     )  1

  Now if you input the points (0,0), (1,0), (0,1)
[the corners of a unit box] you get:

        (x1, y1), ((x2-x1)+x1, (y2-y1)+y1), ((x3-x1)+x1, ((y3-y1)+y1))
->    (x1, y1), (x2, y2), (x3, y3)

   The corners of your parallelogram; so that matrix maps
the unit box to the parallogram.


> What happens next is that "at" is inverted, 

   Which gives you the matrix from the parallelogram to
the unit box.

> then multiplied by a  similar transform derived from 
> the set of dst points.

   So you have a matrix that goes src -> unit box -> dst.

>  Now you have your new transform (D*).
> 
> I have no idea WHY this works, but I think I'm on the right track of
> HOW it works.

    Hopefully you have some idea why it works now...

> From: Bishop, Michael W. CONTR J9C880 
[mailto:[EMAIL PROTECTED]
> Sent: Fri 10/3/2008 1:31 PM
> To: [email protected]
> Subject: RE: Tracking changes to the rendering transform?
> 
> 
> Hi Thomas,
> 
> I'm following you most of the way with the basic concept.  There are
> a couple things I'm confused about:
> 
> parl_to_parl takes two double[] src and dst as arguments.  The 
> method maps one parallelogram to another, but why does each double[]
> have 6 points?  What is being passed in here, a transform or a 
> parallelogram?  The rest of the code makes sense.
> 
> You also say the approach is to build a matrix that maps a unit 
> square to the edges of a parallelogram.  What is a unit square?  A 
> square that encompasses the parallelogram, much like a traditional 
> bounding box?  I guess I'm still fuzzy on the overall concept.
> 
> Good point that what the receiving client is getting is an 
> "absolute" representation.  It's not really a delta, it represents 
> the current state, replacing whatever was there before.  I wasn't 
> thinking about it that way.  Your explanation makes sense in the 
> equation, but getting D* (applying the 3pt method) is where I'm 
> lost.  My method handles scaling, but yours handles everything, if I
> could figure out how to use it given three points.
> 
> I'd be interested to see how this works and think it'd be useful.  I
> made it through Ordinary Differential Equations in school, so I'm 
> happy to finally be putting Linear Algebra and Trig to use in my career.
> 
> Michael
> 
> ________________________________
> 
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: Fri 10/3/2008 10:54 AM
> To: [email protected]
> Cc: [email protected]
> Subject: RE: Tracking changes to the rendering transform?
> 
> 
> 
> Hi Michael, 
> 
> "Bishop, Michael W. CONTR J9C880" <[EMAIL PROTECTED]> 
> wrote on 10/03/2008 10:22:42 AM:
> 
> > > Once the receiving client gets these three points, I'm not clear 
> > on how to derive the transform from the three
> > > points.  That's a math issue, not a Batik issue of course.
> > 
> > OK, I've been thinking about this issue some.  I think I have an 
> > idea for translate/scale, but I'm not sure about other transform 
values.
> 
>    The best example I could find with google was the affine class from 
agg: 
> 
> https://svn.enthought.
> com/enthought/browser/trunk/src/lib/enthought/kiva/agg/agg-2.
> 4/src/agg_trans_affine.cpp?rev=7913
> 
> 
>    It has parl_to_parl methods that map any parallelogram to another 
> parallelogram. 
> 
> > Let's say the receiving client receives 3 points; A1 (upper-left), 
> > A2 (upper-right), and A3 (lower-left).
> > The receiving client already has a JSVGCanvas with three points C1, 
C2, C3.
> 
>    The important thing about the three point approach is that you 
> honestly don't care what the destination canavas was showing, all 
> you want to do is map those three points to the corners of the 
> client's window (I would ignore aspect ratio issues to start with, 
> but the basic idea would be to modify the target canvas coordinates 
> to account for aspect ratio differences). 
> 
> > I'm thinking that a translation is derived to translate C1 to A1. 
> > Now both of the upper-left corners match.  Now for X scale, you 
> > calculate the distance between C1 and C2 and A1 and A2 and apply the
> > right scale multiple  For Y, it's C1 and C3 and A1 and A3. 
> 
>    This is correct and will handle scaling but see the example 
> code as it will handle any rotation/skew as well. 
> 
> > I don't think you scale around the center; you scale around the 
> > origin (C1).
> 
>    Correct. 
> 
> > What I'm not clear on now is the (unlikely) case of other transforms
> > such as rotation, skew, and shear.
> 
>    These should all just drop out of the above approach, that is what 
> is so nice about it.
> 
> > Am I even on the right track for starting to handle these changes?
> 
>    Yes, I think so, but trying to figure out how to derive the 
> affine to map any three src points to three dest points isn't 
> trivial unless you have a really good understanding of affine 
> transforms.  At some point I may try and write something for 
> the wiki that explains how that 3pt mapping code 
> works as it illustrates some useful ways of thinking about 
> affine transforms. 
> 
>    The basic approach is to build a matrix that maps a 
> unit square to the edges of any parallelogram.  Then you 
> can use inverse and multiply to map between parallelograms. 
> 
> 
> > From: Bishop, Michael W. CONTR J9C880 
[mailto:[EMAIL PROTECTED]
> > Sent: Thu 10/2/2008 11:04 AM
> > To: [email protected]
> > Subject: RE: Tracking changes to the rendering transform?
> 
> > > You aren't done yet...
> > 
> > This is where I start to get confused.  I have to remove the 
> > existing VIEWING transform to derive the RENDERING transform?  So I 
> > "remove" the VIEWING transform by doing the inverse, then apply that
> > inverse to the RENDERING transform to get the final value?
> 
>    Right it's useful to view it this way: 
>         D = Display transform, goes from Root SVG elements 
>             coordinate system to screen pixels. 
>         V = Viewing transform, the transform established by 
>             the viewBox and window size. 
>         R = Rendering transform, the transform created by 
pan/zoom/rotate. 
> 
>         V*R = D 
> 
>     Using the 3pt method you will calculate a new D -> D'.  So you 
>     want to calculate an R' such that: 
>         V*R' = D' 
> 
>     The easiest way to do that is: 
>         inv(V)*V*R' = inv(V)*D' 
>     Which is the same as: 
>         R' = inv(V)*D' 
> 
> 
> 
> > 
> > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > Sent: Tue 9/30/2008 9:21 PM
> > To: [email protected]
> > Cc: [email protected]
> > Subject: RE: Tracking changes to the rendering transform?
> > 
> > 
> > 
> > Hi Michael,
> > 
> > "Bishop, Michael W. CONTR J9C880" <[EMAIL PROTECTED]> 
> > wrote on 09/25/2008 01:13:47 PM:
> > 
> > >    "The one thing you need to consider is that the rendering 
transform 
> > > does interact with the viewing transform (From the viewbox).  So in 
> > > the case that the window that is viewing the document is a different 

> > > size/aspect ratio then you may need a different rendering transform 
> > > to get the same 'view'. "
> > > 
> > > In a whiteboarding situation, the document is supposed to stay in 
> > > sync between clients.  Assuming that we are syncing changes to the 
> > > viewBox attribute, does this satisfy the need to manage the 
> > viewing transform?
> > 
> >    I don't think so... 
> > 
> >    Since the rendering transform sits outside of the viewing transform 

> > if one client has a window that is say 600 pixels wide and is paned 
over 
> > so that the left edge is in the middle of the screen their translate 
> > would be 300.   However if that is applied to a Window that is 1200 
> > pixels wide the left edge would only be 1/4 of the way across. 
> > 
> >    One way to view this problem is to communicate what points in 
> > the root SVG element's coordinate system correspond to the corners 
> > of the window.  With that in mind it's worth noting that a general 
> > affine transform can be specified by the remapping of three points 
> > (e.g. top left, top right, and bottom left points that are visible 
> > in the document).  So you can easily calculate those points by 
> > mapping the corners of the window to the root SVG element's coordinate 

> > system (on change of the rendering transform).  If you then send 
> > those points to the other clients they can calculate the transform 
> > that would map those same points to the corners of the new client's 
> > window (probably with some adjustment for aspect ratio - which is 
> > simple if you don't allow for non-uniform scaling).  You aren't 
> > done yet because that is the full transform and you need to remove 
> > the existing viewing transform to know what the rendering transform 
> > should be.  Fortunately that is simply a matter of inverting the 
> > viewing transform and multiplying/premultiplying that with the 
> > 'full transform' to get the residual that should be set as the 
> > rendering transform. 
> > 
> >    I hope that this makes some sense to you. 
> > 
> > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > > Sent: Thu 9/25/2008 6:34 AM
> > > To: [email protected]
> > > Cc: [email protected]
> > > Subject: RE: Tracking changes to the rendering transform?
> > > 
> > > 
> > > 
> > > 
> > > Hi Dan,  Michael,
> > > 
> > > "Dan Slater" <[EMAIL PROTECTED]> wrote on 09/23/2008 02:01:01 
PM:
> > > 
> > > > Extend the JSVGCanvas and override the setRenderingTransform 
method.
> > > > For example:
> > > 
> > >    Yes, this is how I would track changes to the rendering 
transform. 
> > > We don't expose it through any of the Swing change API's. 
> > > 
> > > >         public void setRenderingTransform(final AffineTransform 
at) {
> > > >             //System.out.println("JSVGCanvasX set rendering 
> > transform...");
> > > >             setRenderingTransform(at, true);
> > > >             Point2D.Double pt2d = new Point2D.
> > > > Double(locationListener.getLastX(),locationListener.getLastY());
> > > >             SVGSVGElement root = 
this.getSVGDocument().getRootElement();
> > > >             if (root != null) setUserPositionXY(pt2d, root);
> > > >        }
> > > 
> > > "Bishop, Michael" <[EMAIL PROTECTED]> wrote on 
09/23/2008:
> > > 
> > > >> I'm in a whiteboarding situation where I want to communicate my 
> > > >> "view" to other users. If I pan/zoom/etc, I want to be able to 
> > > >> notify the other users as to what I'm looking at. I'm talking 
about 
> > > >> view changes that do not modify the document.
> > > > 
> > > >> I believe I can do this by tracking the render transform. Is 
there a
> > > >> way to listen for changes to the render transform? 
> > > 
> > >     See above... 
> > > 
> > > >> Is there anything else I have to think about tracking to achieve 
> > > >> this goal? I know the "viewBox" attribute exists, but that's 
> > > >> different; it's a modification to the document itself.
> > > 
> > >    The one thing you need to consider is that the rendering 
transform 
> > > does interact with the viewing transform (From the viewbox).  So in 
> > > the case that the window that is viewing the document is a different 

> > > size/aspect ratio then you may need a different rendering transform 
> > > to get the same 'view'. 
> > > 
> > > [attachment "winmail.dat" deleted by Thomas E. DeWeese/449433/EKC] 
> > > 
---------------------------------------------------------------------
> > > To unsubscribe, e-mail: 
[EMAIL PROTECTED]
> > > For additional commands, e-mail: 
[EMAIL PROTECTED]
> > [attachment "winmail.dat" deleted by Thomas E. DeWeese/449433/EKC] 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: 
[EMAIL PROTECTED]
> [attachment "winmail.dat" deleted by Thomas E. DeWeese/449433/EKC] 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to