diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java @ 8886:cc86b0f9b3c3

SINFO-FlowDepth - work on tkh themes
author gernotbelger
date Wed, 14 Feb 2018 18:10:53 +0100
parents 7a8c12706834
children a66f2a7c4f84
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java	Wed Feb 14 18:10:28 2018 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java	Wed Feb 14 18:10:53 2018 +0100
@@ -13,6 +13,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 
 import gnu.trove.TDoubleArrayList;
 
@@ -21,8 +22,7 @@
  *
  * @author Gernot Belger
  */
-class FlowDepthCalculationResult
-implements Serializable {
+class FlowDepthCalculationResult implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -40,8 +40,11 @@
         this.sounding = sounding;
     }
 
-    public void addRow(final double station, final double flowDepth, final double flowDepthWithTkh, final double tkh, final double waterlevel, final double discharge, final String waterlevelLabel, final String gauge, final double meanBedHeight, final String sondageLabel, final String location) {
-        this.rows.add(new FlowDepthRow(station, flowDepth, flowDepthWithTkh, tkh, waterlevel, discharge, waterlevelLabel, gauge, meanBedHeight, sondageLabel, location));
+    public void addRow(final double station, final double flowDepth, final double flowDepthWithTkh, final SoilKind tkhKind, final double tkh,
+            final double tkhUp, final double tkhDown, final double waterlevel, final double discharge, final String waterlevelLabel, final String gauge,
+            final double meanBedHeight, final String sondageLabel, final String location) {
+        this.rows.add(new FlowDepthRow(station, flowDepth, flowDepthWithTkh, tkhKind, tkh, tkhUp, tkhDown, waterlevel, discharge, waterlevelLabel, gauge,
+                meanBedHeight, sondageLabel, location));
     }
 
     public String getLabel() {
@@ -57,7 +60,7 @@
     }
 
     public Collection<FlowDepthRow> getRows() {
-        return  Collections.unmodifiableCollection( this.rows );
+        return Collections.unmodifiableCollection(this.rows);
     }
 
     public double[][] getFlowDepthPoints() {
@@ -86,15 +89,74 @@
         return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
     }
 
-    public double[][] getTkhPoints() {
+    public double[][] getTkhUpPoints() {
         final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
         final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
+        final List<SoilKind> kinds = new ArrayList<>(this.rows.size());
 
         for (final FlowDepthRow row : this.rows) {
             xPoints.add(row.getStation());
-            yPoints.add(row.getTkh());
+            yPoints.add(row.getTkhUp());
+            kinds.add(row.getTkhKind());
         }
 
-        return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
+        return adjustTkhVisualization(xPoints, yPoints, kinds);
+    }
+
+    public double[][] getTkhDownPoints() {
+        final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
+        final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
+        final List<SoilKind> kinds = new ArrayList<>(this.rows.size());
+
+        for (final FlowDepthRow row : this.rows) {
+            xPoints.add(row.getStation());
+            yPoints.add(row.getTkhDown());
+            kinds.add(row.getTkhKind());
+        }
+
+        return adjustTkhVisualization(xPoints, yPoints, kinds);
+    }
+
+    /**
+     * the up and down points must be further adjusted for visualization, see Mail Hr. Reiß
+     * basically we need to introduce extra points when the kind changes, so we get vertical lines in that case
+     */
+    private double[][] adjustTkhVisualization(final TDoubleArrayList xPoints, final TDoubleArrayList yPoints, final List<SoilKind> kinds) {
+
+        final TDoubleArrayList adjustedX = new TDoubleArrayList(xPoints.size());
+        final TDoubleArrayList adjustedY = new TDoubleArrayList(yPoints.size());
+
+        adjustedX.add(xPoints.get(0));
+        adjustedY.add(yPoints.get(0));
+
+        for (int i = 1; i < xPoints.size(); i++) {
+
+            final SoilKind kind1 = kinds.get(i - 1);
+            final SoilKind kind2 = kinds.get(i);
+
+            if (kind1 != kind2) {
+                /* introduce two extra points in order to create a vertical line in the middle of the two adjacent points */
+                final double x1 = xPoints.get(i - 1);
+                final double y1 = yPoints.get(i - 1);
+                final double x2 = xPoints.get(i);
+                final double y2 = yPoints.get(i);
+
+                final double middleX = (x1 + x2) / 2;
+
+                // REMARK: we can't produce a 100% vertical line, as the area-renderer will not work correctly
+                adjustedX.add(middleX - 0.0001);
+                adjustedY.add(y1);
+
+                adjustedX.add(middleX + 0.0001);
+                adjustedY.add(y2);
+            }
+
+            /* always add the real point now */
+            adjustedX.add(xPoints.get(i));
+            adjustedY.add(yPoints.get(i));
+        }
+
+
+        return new double[][] { adjustedX.toNativeArray(), adjustedY.toNativeArray() };
     }
 }
\ No newline at end of file

http://dive4elements.wald.intevation.org