You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/08/14 22:27:56 UTC
[sis] 03/03: Try to show more debugging information during isoline generation.
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 <ma...@geomatys.com>
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;
+ }
}
}
}