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;
+                            }
                         }
                     }
                 }

Reply via email to