xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bishop, Michael W. CTR USJFCOM JFL" <michael.bishop....@jfcom.mil>
Subject Understanding CTMs...
Date Tue, 20 Jan 2009 03:09:27 GMT
Hi all,
 
I'm still having a problem finding out if a select box drawn on the canvas completely bounds
an element drawn on a document because I can't get my coordinate systems straight.  So I figure
I need to get my understanding of CTMs correct.
 
SVGLocatable.getCTM():  This CTM is from what I understand, the "transform" applied to that
element.
SVGLocatable.getScreenCTM():  This CTM transforms points from document coordinates to screen
(canvas) coordinates.
 
In an attempt to find out if a select box drawn with the mouse completely bounds other elements,
I decided to try and transform everything to document coordinates.
 
----------------
Select Box
----------------
When the mouse is pressed, I record the x, y coordinates as given from a MouseEvent attached
to the JSVGCanvas.  When the mouse is dragged and released, I record the x, y coordinates
again.  Now I have a select box in mouse/canvas coordinates.
 
Now I take those coordinates and push them through the document's root element inverse of
the screen CTM:
 
SVGLocatable rootLoc = (SVGLocatable) svgDocument.getDocumentElement();
SVGMatrix matrix = rootLoc.getScreenCTM().inverse();
 
This SHOULD be transforming the select box from mouse/canvas coordinates to document coordinates.
--------------
Elements
--------------
 
Elements already on the document are drawn in a similar manner.  In the case of a <rect>
element, I record x and y as stated above and create a <rect> element with x, y, w,
and h.  Then I give the <rect> element a transform attribute that represents the inverse
of the JSVGCanvas's viewing transform.  This way, a user can draw what they see no matter
how the canvas is translated, zoomed, etc.
 
In order to translate an element to proper document coordinates, I get the bounding box of
the element (SVGLocatable.getBBox), then push that bounding box through the element's CTM
(SVGLocatable.getCTM).
 
At this point, both the select box and the potentially selected elements SHOULD be in the
same coordinate system.
 
-----------
Results
-----------
 
I get expected results MOST of the time.  This works perfectly (zoom, pan, etc) UNLESS the
size of the document does not match the size of the canvas.  An 800x600 document in a 800x600
canvas works perfectly.  A 1000x600 document in a 800x600 canvas (letterboxing on the top
and bottom) does NOT.
 
I'm definitely doing something wrong, but I'm not sure what and I keep coming back to this
problem week after week.  Someone's got to understand what's going on.  The end goal is simply
to have the select box and the elements in the same coordinate system so I can figure out
which elements are bounded by the select box.
 
----------------------------------------------------------------------------------------------------------------------------------
Select Coodinates -> rootElement.getScreenCTM().inverse() == Document coordinates (?)
Element Bounding Box -> element.getCTM() == Document coordinates (?)
 
This works unless canvas size <> document size.
----------------------------------------------------------------------------------------------------------------------------------
 
Any guidance is much appreciated.
 
Michael Bishop

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