package org.geotoolkit.display2d.style.j2d; import java.awt.geom.Line2D; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; import org.geotoolkit.display.shape.ShapeUtilities; /** * * @author Johann Sorel (Geomatys) */ public class RegularPathWalker { private final List<Point2D> points = new ArrayList<>(); private final double resolution; private final Line2D.Double line = new Line2D.Double(); public RegularPathWalker(final PathIterator pathIterator, double resolution) { this.resolution = resolution; final double[] currentPoint = new double[6]; final double[] lastPoint = new double[6]; double segmentStartX; double segmentStartY; double segmentEndX; double segmentEndY; double lastmoveToX = 0; double lastmoveToY = 0; while (!pathIterator.isDone()) { final int type = pathIterator.currentSegment(currentPoint); switch (type) { case PathIterator.SEG_MOVETO: System.arraycopy(currentPoint, 0, lastPoint, 0, 6); segmentStartX = lastPoint[0]; segmentStartY = lastPoint[1]; segmentEndX = currentPoint[0]; segmentEndY = currentPoint[1]; //keep point for close instruction lastmoveToX = currentPoint[0]; lastmoveToY = currentPoint[1]; points.add(new Point2D.Double(currentPoint[0], currentPoint[1])); break; case PathIterator.SEG_CLOSE: currentPoint[0] = lastmoveToX; currentPoint[1] = lastmoveToY; // Fall into.... case PathIterator.SEG_LINETO: segmentStartX = lastPoint[0]; segmentStartY = lastPoint[1]; segmentEndX = currentPoint[0]; segmentEndY = currentPoint[1]; line.x1 = segmentStartX; line.y1 = segmentStartY; line.x2 = segmentEndX; line.y2 = segmentEndY; addValuesOn(line, (Point2D)points.get(points.size()-1).clone()); break; } System.arraycopy(currentPoint, 0, lastPoint, 0, 6); pathIterator.next(); } } public boolean isFinished() { return points.size() < 2; } public Line2D.Double next(){ final Point2D p1 = points.get(0); final Point2D p2 = points.get(1); line.setLine(p1, p2); points.remove(0); return line; } public void addValuesOn(final Line2D.Double line, final Point2D closePoint) { double distance = resolution; Point2D position; while ((position = ShapeUtilities.colinearPoint(line, closePoint, distance)) != null) { points.add(position); line.x1 = position.getX(); line.y1 = position.getY(); closePoint.setLocation(position); distance = resolution; } //return distance - previous.distance(line.getP2()); } }