Hi Michael, "Bishop, Michael W. CONTR J9C880" <[EMAIL PROTECTED]> wrote on 10/03/2008 04:36:37 PM:
> > This isn't a proper representation of their matrix. They store it as... > > Who is "they?" The Agg folks. > I was going with the example from my SVG book and > the Java documentation where: > > { a, b, c, d, e, f} passed into the constructor comes out: > > a c e > b d f > 0 0 1 This is correct (it's just the transpose of the way I wrote the matrix) but earlier you wrote the matrix as: a b c d e f 0 0 1 Which would not give you the right answer, I was trying to help you out there (but I don't think it worked ;). > Is their representation an AffineTransform or simply a matrix? An AffineTransform is a matrix, so I'm not sure what distinction you are trying to make. > The next step is where I get a little lost. We take three points > that represent the unit box and "input" them? Does this mean that > we simply derive them from the matrix? Or is this your > demonstration of why this works and not part of the actual computation? It's part of my demonstration (by input I meant transform the points by the matrix). > Point2D upperLeft = new Point2D.Double(0, 1); > Point2D derivedUpperLeft = at.transform(upperLeft); > derivedPoint.equals(new Point2D.Double(a, b)); // This should be true? Actually I think it should be (c+e, d+f) assuming a & b are meant to be from the constructor of the matrix. Also while (0, 1) would be upper left in a Cartesian coordinate system it's bottom left in SVG (I'm not trying to nit pick just want to make sure we are on the same page). > So yes, given the src, you map to the common unit and from there you > can map to the destination. I think I follow that. I guess the > only confusion is why the matrix representation doesn't match what I > normally expect. I think it's the same (I always think of the matrix transposed, so I probably confused you - sorry). > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: Fri 10/3/2008 3:08 PM > To: batik-users@xmlgraphics.apache.org > Cc: batik-users@xmlgraphics.apache.org > Subject: RE: Tracking changes to the rendering transform? > > > > 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: batik-users@xmlgraphics.apache.org > > 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: batik-users@xmlgraphics.apache.org > > Cc: batik-users@xmlgraphics.apache.org > > 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:michael.bishop. > [EMAIL PROTECTED] > > > Sent: Thu 10/2/2008 11:04 AM > > > To: batik-users@xmlgraphics.apache.org > > > 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: batik-users@xmlgraphics.apache.org > > > Cc: batik-users@xmlgraphics.apache.org > > > 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: batik-users@xmlgraphics.apache.org > > > > Cc: batik-users@xmlgraphics.apache.org > > > > 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] > [attachment "winmail.dat" deleted by Thomas E. DeWeese/449433/EKC] > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED]