This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 50f768333dd74e6bcfb386ec7f37acc6998bb0ce Author: Martin Desruisseaux <[email protected]> AuthorDate: Mon Aug 15 00:25:28 2022 +0200 Try to show more debugging information during isoline generation. --- .../sis/internal/feature/j2d/MultiPolylines.java | 13 +++++++- .../apache/sis/internal/feature/j2d/Polyline.java | 13 +++++++- .../sis/internal/feature/j2d/package-info.java | 2 +- .../processing/isoline/PolylineBuffer.java | 9 +----- .../internal/processing/isoline/PolylineStage.java | 36 +++++++++++++++++++++- .../sis/internal/processing/isoline/Tracer.java | 1 + .../internal/processing/isoline/StepsViewer.java | 23 ++++++++------ 7 files changed, 75 insertions(+), 22 deletions(-) diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/MultiPolylines.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/MultiPolylines.java index aea1b7ae40..1139819964 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/MultiPolylines.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/MultiPolylines.java @@ -23,6 +23,7 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.PathIterator; import java.awt.geom.AffineTransform; import org.apache.sis.internal.referencing.j2d.IntervalRectangle; +import org.apache.sis.util.Classes; /** @@ -36,7 +37,7 @@ import org.apache.sis.internal.referencing.j2d.IntervalRectangle; * </ul> * * @author Martin Desruisseaux (Geomatys) - * @version 1.1 + * @version 1.3 * @since 1.1 * @module */ @@ -178,4 +179,14 @@ final class MultiPolylines extends FlatShape { } return null; } + + /** + * Returns a string representation for debugging purposes. + * + * @return a debug string representation. + */ + @Override + public String toString() { + return Classes.getShortClassName(this) + '[' + (polylines.length / 2) + " polylines]"; + } } diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Polyline.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Polyline.java index 2272236471..5b9c8acc5d 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Polyline.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Polyline.java @@ -24,6 +24,7 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.PathIterator; import java.awt.geom.AffineTransform; import org.apache.sis.internal.util.Numerics; +import org.apache.sis.util.Classes; /** @@ -57,7 +58,7 @@ import org.apache.sis.internal.util.Numerics; * </ol> * * @author Martin Desruisseaux (Geomatys) - * @version 1.1 + * @version 1.3 * @since 1.1 * @module */ @@ -304,4 +305,14 @@ class Polyline extends FlatShape { return (position == 0) ? SEG_MOVETO : SEG_LINETO; } } + + /** + * Returns a string representation for debugging purposes. + * + * @return a debug string representation. + */ + @Override + public String toString() { + return Classes.getShortClassName(this) + '[' + (coordinates.length / 2) + " points]"; + } } diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/package-info.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/package-info.java index d7ee3c90d5..f88948692d 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/package-info.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/package-info.java @@ -25,7 +25,7 @@ * may change in incompatible ways in any future version without notice. * * @author Martin Desruisseaux (Geomatys) - * @version 1.2 + * @version 1.3 * * @see org.apache.sis.internal.referencing.j2d * diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineBuffer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineBuffer.java index be7b42e4f2..d7c1687462 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineBuffer.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineBuffer.java @@ -205,13 +205,6 @@ final class PolylineBuffer { */ @Debug final void toRawPath(final Map<PolylineStage,Path2D> appendTo) { - int i = 0; - if (i < size) { - final Path2D p = PolylineStage.BUFFER.destination(appendTo); - p.moveTo(coordinates[i++], coordinates[i++]); - while (i < size) { - p.lineTo(coordinates[i++], coordinates[i++]); - } - } + PolylineStage.BUFFER.add(appendTo, coordinates, size); } } diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineStage.java b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineStage.java index 7ad1733809..477aa3a583 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineStage.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/PolylineStage.java @@ -64,10 +64,44 @@ enum PolylineStage { * @param appendTo map of path for different stages. * @return the path to use for writing polylines at this stage. */ - final Path2D destination(final Map<PolylineStage,Path2D> appendTo) { + private Path2D destination(final Map<PolylineStage,Path2D> appendTo) { return appendTo.computeIfAbsent(this, (k) -> new Path2D.Float()); } + /** + * Adds coordinates to the specified map. + * + * @param appendTo where to append the coordinates. + * @param coordinates (x,y) tuples to append, starting with the coordinate at index 0. + * @param size number of coordinates to add (twice the number of tuples). + */ + final void add(final Map<PolylineStage,Path2D> appendTo, final double[] coordinates, final int size) { + int i = 0; + if (i < size) { + final Path2D p = destination(appendTo); + p.moveTo(coordinates[i++], coordinates[i++]); + while (i < size) { + p.lineTo(coordinates[i++], coordinates[i++]); + } + } + } + + /** + * Adds polylines in the values of the given map. Keys are ignored. + * + * @param appendTo where to append the coordinates. + * @param partialPaths map of polylines to add. + */ + final void add(final Map<PolylineStage,Path2D> appendTo, final Map<?,Fragments> partialPaths) { + for (final Fragments fragment : partialPaths.values()) { + for (final double[] coordinates : fragment) { + if (coordinates != null) { + add(appendTo, coordinates, coordinates.length); + } + } + } + } + /** * Adds polylines to the specified map. * diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/Tracer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/Tracer.java index d6e3e6cfc6..e88944a163 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/Tracer.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/isoline/Tracer.java @@ -695,6 +695,7 @@ final class Tracer { @Debug final void toRawPath(final Map<PolylineStage,Path2D> appendTo) { PolylineStage.FINAL.add(appendTo, (path != null) ? path.snapshot() : shape); + PolylineStage.FRAGMENT.add(appendTo, partialPaths); polylineOnLeft.toRawPath(appendTo); for (final PolylineBuffer p : polylinesOnTop) { if (p != null) p.toRawPath(appendTo); diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/processing/isoline/StepsViewer.java b/core/sis-feature/src/test/java/org/apache/sis/internal/processing/isoline/StepsViewer.java index 4f540210bf..ce40d28571 100644 --- a/core/sis-feature/src/test/java/org/apache/sis/internal/processing/isoline/StepsViewer.java +++ b/core/sis-feature/src/test/java/org/apache/sis/internal/processing/isoline/StepsViewer.java @@ -145,7 +145,7 @@ public final class StepsViewer extends JComponent implements BiConsumer<String,I @SuppressWarnings("ThisEscapedInObjectConstruction") private StepsViewer(final RenderedImage data, final Container pane) { isolines = new EnumMap<>(PolylineStage.class); - stageColors = new Color[] {Color.YELLOW, Color.CYAN, Color.GRAY}; + stageColors = new Color[] {Color.YELLOW, Color.CYAN, Color.LIGHT_GRAY}; setBackground(Color.BLACK); setOpaque(true); final double scaleX = (CANVAS_WIDTH - 2*PADDING) / (double) data.getWidth(); @@ -215,9 +215,9 @@ public final class StepsViewer extends JComponent implements BiConsumer<String,I gh.draw(bounds); } for (final Map.Entry<PolylineStage,Path2D> entry : isolines.entrySet()) { - final int stage = entry.getKey().ordinal(); - gh.setStroke(new BasicStroke(stageColors.length - stage)); - gh.setColor(stageColors[stage]); + final PolylineStage stage = entry.getKey(); + gh.setStroke(new BasicStroke(stage == PolylineStage.BUFFER ? 2 : 0)); + gh.setColor(stageColors[stage.ordinal()]); gh.draw(entry.getValue()); } } @@ -286,13 +286,16 @@ public final class StepsViewer extends JComponent implements BiConsumer<String,I isolines.remove(stage); } else { isolines.put(stage, update); - if (stage == PolylineStage.BUFFER) { + if (b == null) { b = update.getBounds(); - b.x -= PADDING; - b.y -= PADDING; - b.width += PADDING * 2; - b.height += PADDING * 2; - bounds = b; + if (b.isEmpty()) { + b = null; + } else { + b.x -= PADDING; + b.y -= PADDING; + b.width += PADDING * 2; + b.height += PADDING * 2; + } } } }
