gernotbelger@8946: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8946: * Software engineering by gernotbelger@8946: * Björnsen Beratende Ingenieure GmbH gernotbelger@8946: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8946: * gernotbelger@8946: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8946: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8946: * documentation coming with Dive4Elements River for details. gernotbelger@8946: */ gernotbelger@8946: package org.dive4elements.river.artifacts.sinfo.common; gernotbelger@8946: gernotbelger@8946: import java.util.Collection; gernotbelger@8946: import java.util.List; gernotbelger@8946: gernotbelger@9585: import org.apache.commons.collections.PredicateUtils; gernotbelger@9170: import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; gernotbelger@9000: import org.dive4elements.river.artifacts.common.ResultRow; gernotbelger@8946: import org.dive4elements.river.artifacts.sinfo.tkhcalculation.SoilKind; gernotbelger@8946: import org.dive4elements.river.artifacts.sinfo.util.WstInfo; gernotbelger@8946: gernotbelger@8946: import gnu.trove.TDoubleArrayList; gernotbelger@8946: gernotbelger@8946: /** gernotbelger@8946: * @author Gernot Belger gernotbelger@8946: */ gernotbelger@9170: gernotbelger@9195: public abstract class AbstractTkhCalculationResult extends AbstractCalculationExportableResult { gernotbelger@8946: gernotbelger@8946: private static final long serialVersionUID = 1L; gernotbelger@8946: gernotbelger@8946: private final boolean hasTkh; gernotbelger@9170: private final WstInfo wst; gernotbelger@8946: gernotbelger@9000: public AbstractTkhCalculationResult(final String label, final WstInfo wst, final boolean hasTkh, final Collection rows) { gernotbelger@9170: super(label, rows); gernotbelger@9170: this.wst = wst; gernotbelger@8946: this.hasTkh = hasTkh; gernotbelger@8946: } gernotbelger@8946: gernotbelger@8946: public final boolean hasTkh() { gernotbelger@8946: return this.hasTkh; gernotbelger@8946: } gernotbelger@9585: gernotbelger@9362: public boolean isShowRefGauges() { gernotbelger@9362: return this.wst.isShowRefGauges(); gernotbelger@9362: } gernotbelger@8946: gernotbelger@8946: public final double[][] getTkhUpPoints() { gernotbelger@8946: gernotbelger@8948: final double[][] points = getStationPoints(SInfoResultType.tkhup); gernotbelger@9585: final List kinds = getValues(SInfoResultType.soilkind, PredicateUtils.truePredicate()); gernotbelger@8946: gernotbelger@8948: final double[] xPoints = points[0]; gernotbelger@8948: final double[] yPoints = points[1]; gernotbelger@8946: gernotbelger@8946: return adjustTkhVisualization(xPoints, yPoints, kinds); gernotbelger@8946: } gernotbelger@8946: gernotbelger@8946: public final double[][] getTkhDownPoints() { gernotbelger@8946: gernotbelger@8948: final double[][] points = getStationPoints(SInfoResultType.tkhdown); gernotbelger@9585: final List kinds = getValues(SInfoResultType.soilkind, PredicateUtils.truePredicate()); gernotbelger@8946: gernotbelger@8948: final double[] xPoints = points[0]; gernotbelger@8948: final double[] yPoints = points[1]; gernotbelger@8946: gernotbelger@8946: return adjustTkhVisualization(xPoints, yPoints, kinds); gernotbelger@8946: } gernotbelger@8946: gernotbelger@8946: /** gernotbelger@8946: * the up and down points must be further adjusted for visualization, see Mail Hr. Reiß gernotbelger@8946: * basically we need to introduce extra points when the kind changes, so we get vertical lines in that case gernotbelger@8946: */ gernotbelger@8948: private double[][] adjustTkhVisualization(final double[] xPoints, final double[] yPoints, final List kinds) { gernotbelger@8946: gernotbelger@8948: final TDoubleArrayList adjustedX = new TDoubleArrayList(xPoints.length); gernotbelger@8948: final TDoubleArrayList adjustedY = new TDoubleArrayList(yPoints.length); gernotbelger@8946: gernotbelger@8948: adjustedX.add(xPoints[0]); gernotbelger@8948: adjustedY.add(yPoints[0]); gernotbelger@8946: gernotbelger@8948: for (int i = 1; i < xPoints.length; i++) { gernotbelger@8946: gernotbelger@8946: final SoilKind kind1 = kinds.get(i - 1); gernotbelger@8946: final SoilKind kind2 = kinds.get(i); gernotbelger@8946: gernotbelger@8946: if (kind1 != kind2) { gernotbelger@8946: /* introduce two extra points in order to create a vertical line in the middle of the two adjacent points */ gernotbelger@8948: final double x1 = xPoints[i - 1]; gernotbelger@8948: final double y1 = yPoints[i - 1]; gernotbelger@8948: final double x2 = xPoints[i]; gernotbelger@8948: final double y2 = yPoints[i]; gernotbelger@8946: gernotbelger@8946: final double middleX = (x1 + x2) / 2; gernotbelger@8946: gernotbelger@8946: // REMARK: we can't produce a 100% vertical line, as the area-renderer will not work correctly gernotbelger@8946: adjustedX.add(middleX - 0.0001); gernotbelger@8946: adjustedY.add(y1); gernotbelger@8946: gernotbelger@8946: adjustedX.add(middleX + 0.0001); gernotbelger@8946: adjustedY.add(y2); gernotbelger@8946: } gernotbelger@8946: gernotbelger@8946: /* always add the real point now */ gernotbelger@8948: adjustedX.add(xPoints[i]); gernotbelger@8948: adjustedY.add(yPoints[i]); gernotbelger@8946: } gernotbelger@8946: gernotbelger@8946: return new double[][] { adjustedX.toNativeArray(), adjustedY.toNativeArray() }; gernotbelger@8946: } gernotbelger@9170: gernotbelger@9170: public final WstInfo getWst() { gernotbelger@9170: return this.wst; // TODO: Meta-Data export hier hin gernotbelger@9170: } gernotbelger@8946: }