I don't have time to look at it closely right now, but it sounds like a logical simplification. I hate that temp array too.
regards, Larry On 6/4/07, Michaël Michaud <[EMAIL PROTECTED]> wrote: > Hi Sascha; > > Sounds interesting. > Please, let me some more time to have a closer look and see how your > code compare to the one in CVS. > Note : I made a recent change in CVS to have the resolution as a > property and modify it as needed (default=1/2 pixel) for special renderers. > > Michael > > Sascha L. Teichmann a écrit : > > >Hi Larry, hi Michaël, > > > >I had a look at the decimation code in Java2DConverter. > >This is awesome! Congratulations! :-) > > > >But way not go step further and streamline the model to view > >coordination transform. Why to create all this temporary > >Coordinate[] stuff? In the end all what matters is a PathIterator > >that can handle an AffineTransform coming from Java2D. > >Instead of transform the data to a temporary Coordinate array > >and used this to construct GeneralPaths we can write a PathIterator > >that transforms and decimates the data on-the-fly. > >All we have to do is to concatenate the model to view transform to the > >incoming matrix. > > > >To archive this we must add a > > > >AffineTransform getModelToViewTransform(); > > > >method to the Java2DConverter.PointConverter interface. This > >does not hurt because Viewport already implements it. > > > >To see what I mean, look at the DirectPolygonShape that I've > >attached. It handles the Polygon case of Java2DConverter. > >Add this class to the sources and change the toShape(Polygon) > >method to look as follow: > > > > private Shape toShape(Polygon polygon) throws > > NoninvertibleTransformException > > { > > return new DirectPolygonShape( > > polygon, > > pointConverter.getModelToViewTransform(), > > 1d / (2d*pointConverter.getScale())); > > } > > > >Speaking of performance. On my computer > >(very old 1.2 GHz AMD/Athlon-T-Bird running GNU/Linux, Java 6) > >the burluc layer is rendered in full extend without the streamling > >in about 9.x seconds, with the streamling in about 8.x secs, with > >x varying a bit. It's just a second, but it's a second! ;-) > > > >What do you think? > > > >Regards, Sascha > > > > > >------------------------------------------------------------------------ > > > > > >/* > > * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI > > * for visualizing and manipulating spatial features with geometry and > > attributes. > > * > > * Copyright (C) 2003 Vivid Solutions > > * > > * This program is free software; you can redistribute it and/or > > * modify it under the terms of the GNU General Public License > > * as published by the Free Software Foundation; either version 2 > > * of the License, or (at your option) any later version. > > * > > * This program is distributed in the hope that it will be useful, > > * but WITHOUT ANY WARRANTY; without even the implied warranty of > > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > * GNU General Public License for more details. > > * > > * You should have received a copy of the GNU General Public License > > * along with this program; if not, write to the Free Software > > * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, > > USA. > > * > > * For more information, contact: > > * > > * Vivid Solutions > > * Suite #1A > > * 2328 Government Street > > * Victoria BC V8T 5G5 > > * Canada > > * > > * (250)385-6040 > > * www.vividsolutions.com > > */ > > > >package com.vividsolutions.jump.workbench.ui.renderer.java2D; > > > >import com.vividsolutions.jts.geom.Coordinate; > >import com.vividsolutions.jts.geom.Polygon; > > > >import java.awt.Rectangle; > >import java.awt.Shape; > >import java.awt.geom.AffineTransform; > >import java.awt.geom.GeneralPath; > >import java.awt.geom.PathIterator; > >import java.awt.geom.Point2D; > >import java.awt.geom.Rectangle2D; > > > >import java.util.Iterator; > >import java.util.NoSuchElementException; > > > >// for more accurate (float instead of int) rendering. > >// From larry becker's SkyJUMP code to OpenJUMP [mmichaud] > >// Streamlined [s-l-teichmann] > >public class DirectPolygonShape > >implements Shape > >{ > > private Polygon polygon; > > private AffineTransform model2view; > > private double halfPixel; > > > > protected DirectPolygonShape(){ > > } > > > > /** > > * @param polygon the JTS polygon > > * @param model2view the affine transform from model to view > > * @param halfPixel line segments shorter than halfPixel are ignored. > > */ > > public DirectPolygonShape( > > Polygon polygon, > > AffineTransform model2view, > > double halfPixel > > ) { > > this.polygon = polygon; > > this.model2view = model2view; > > this.halfPixel = halfPixel; > > } > > > > /** > > * helper PathIterator that iterates over PathIterators > > */ > > public final class PathIteratorsIterator > > implements PathIterator > > { > > private Iterator iterators; > > private boolean done; > > private PathIterator current; > > > > public PathIteratorsIterator(Iterator iterators) { > > this.iterators = iterators; > > > > if (!iterators.hasNext()) > > done = true; > > else > > current = (PathIterator)iterators.next(); > > } > > > > public int getWindingRule() { > > return WIND_EVEN_ODD; > > } > > > > public boolean isDone() { > > return done; > > } > > > > public void next() { > > if (done) > > return; > > > > if (current.isDone()) { > > if (iterators.hasNext()) > > current = > > (PathIterator)iterators.next(); > > else > > done = true; > > } > > else > > current.next(); > > } > > > > public int currentSegment(float [] coords) { > > return current.currentSegment(coords); > > } > > > > public int currentSegment(double [] coords) { > > return current.currentSegment(coords); > > } > > } // class PathIteratorsIterator > > > > /** > > * Implements a PathIterator and Larry's decimator on-the-fly > > */ > > public static final class AffinePolygonPath > > implements PathIterator > > { > > private int iterate; > > private Coordinate [] points; > > private Point2D.Double tmp; > > private AffineTransform xform; > > private double halfPixel; > > private Coordinate p0; > > private int segmentType; > > > > public AffinePolygonPath( > > Coordinate [] points, > > AffineTransform xform, > > double halfPixel > > ){ > > this.xform = xform; > > this.points = points; > > this.halfPixel = halfPixel; > > tmp = new Point2D.Double(); > > internalNext(); > > } > > > > /** Math.abs() is a known for being slow ... */ > > private static final double abs(double x) { > > return x < 0d ? -x : x; > > } > > > > private final void internalNext() { > > for (;;) { > > // issue SEG_CLOSE at end > > if (iterate >= points.length) { > > segmentType = SEG_CLOSE; > > break; > > } > > > > // issue first two and last > > if (iterate < 2 || iterate == > > points.length-1) { > > Coordinate pi = points[iterate]; > > tmp.x = pi.x; > > tmp.y = pi.y; > > xform.transform(tmp, tmp); > > p0 = pi; > > } > > else { // distance lesser than halfPixel? > > Coordinate pi = points[iterate]; > > if (abs(p0.x-pi.x) > halfPixel || > > abs(p0.y-pi.y) > halfPixel) { > > tmp.x = pi.x; > > tmp.y = pi.y; > > xform.transform(tmp, tmp); > > p0 = pi; > > } > > else { // yes: try next > > ++iterate; > > continue; > > } > > } > > > > segmentType = iterate == 0 > > ? SEG_MOVETO > > : SEG_LINETO; > > break; > > } // for (;;) > > } > > > > public int currentSegment(double[] coords) { > > coords[0] = tmp.x; > > coords[1] = tmp.y; > > return segmentType; > > } > > > > > > public int currentSegment(float[] coords) { > > coords[0] = (float)tmp.x; > > coords[1] = (float)tmp.y; > > return segmentType; > > } > > > > public int getWindingRule() { > > return GeneralPath.WIND_EVEN_ODD; > > } > > > > public boolean isDone() { > > return segmentType == SEG_CLOSE; > > } > > > > public void next() { > > ++iterate; > > internalNext(); > > } > > } // class AffinePolygonPath > > > > public Rectangle getBounds() { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method getBounds() not yet > > implemented."); > > } > > > > public Rectangle2D getBounds2D() { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method getBounds() not yet > > implemented."); > > } > > > > public boolean contains(double x, double y) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method contains() not yet > > implemented."); > > } > > > > public boolean contains(Point2D p) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method contains() not yet > > implemented."); > > } > > > > public boolean intersects(double x, double y, double w, double h) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method intersects() not yet > > implemented."); > > } > > > > public boolean intersects(Rectangle2D r) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method intersects() not yet > > implemented."); > > } > > > > public boolean contains(double x, double y, double w, double h) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method contains() not yet > > implemented."); > > } > > > > public boolean contains(Rectangle2D r) { > > /[EMAIL PROTECTED] Implement this java.awt.Shape > > method*/ > > throw new java.lang.UnsupportedOperationException( > > "Method contains() not yet > > implemented."); > > } > > > > public PathIterator getPathIterator(AffineTransform xform) { > > > > if (xform == null) > > xform = model2view; > > else { > > xform = new AffineTransform(xform); > > xform.concatenate(model2view); > > } > > > > final AffineTransform at = xform; > > > > return new PathIteratorsIterator(new Iterator() { > > > > int ring; > > > > public boolean hasNext() { > > return ring < polygon.getNumInteriorRing() + > > 1; > > } > > > > public Object next() { > > if (!hasNext()) > > throw new NoSuchElementException(); > > Object x = ring == 0 > > ? new > > AffinePolygonPath(polygon.getExteriorRing().getCoordinates(), at, > > halfPixel) > > : new > > AffinePolygonPath(polygon.getInteriorRingN(ring-1).getCoordinates(), at, > > halfPixel); > > ++ring; > > return x; > > } > > > > public void remove() { > > throw new UnsupportedOperationException(); > > } > > }); > > > > } > > > > public PathIterator getPathIterator(AffineTransform at, double > > flatness) { > > // since we don't support curved geometries, can simply > > delegate to the simple method > > return getPathIterator(at); > > } > >} > >// end of file > > > > > >------------------------------------------------------------------------ > > > >------------------------------------------------------------------------- > >This SF.net email is sponsored by DB2 Express > >Download DB2 Express C - the FREE version of DB2 express and take > >control of your XML. No limits. Just data. Click to get it now. > >http://sourceforge.net/powerbar/db2/ > > > >------------------------------------------------------------------------ > > > >_______________________________________________ > >Jump-pilot-devel mailing list > >Jump-pilot-devel@lists.sourceforge.net > >https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > -- http://amusingprogrammer.blogspot.com/ ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel