diff --git a/src/main/java/de/ph87/data/series/Series.java b/src/main/java/de/ph87/data/series/Series.java index c84a0f7..6df67da 100644 --- a/src/main/java/de/ph87/data/series/Series.java +++ b/src/main/java/de/ph87/data/series/Series.java @@ -37,6 +37,12 @@ public class Series { @Enumerated(EnumType.STRING) private SeriesType type; + @Column(nullable = false) + private boolean graphZero = false; + + @Column(nullable = false) + private boolean graphAutoscale = false; + public Series(@NonNull final String name, @NonNull final Unit unit, @NonNull final SeriesType type) { this.name = name; this.title = name; diff --git a/src/main/java/de/ph87/data/series/SeriesDto.java b/src/main/java/de/ph87/data/series/SeriesDto.java index dc44f50..b3d3e62 100644 --- a/src/main/java/de/ph87/data/series/SeriesDto.java +++ b/src/main/java/de/ph87/data/series/SeriesDto.java @@ -20,6 +20,10 @@ public class SeriesDto { public final SeriesType type; + private final boolean graphZero; + + private final boolean graphAutoscale; + public SeriesDto(@NonNull final Series series) { this.id = series.getId(); this.name = series.getName(); @@ -27,6 +31,8 @@ public class SeriesDto { this.unit = series.getUnit(); this.decimals = series.getDecimals(); this.type = series.getType(); + this.graphZero = series.isGraphZero(); + this.graphAutoscale = series.isGraphAutoscale(); } public String format(@Nullable final Double value) { diff --git a/src/main/java/de/ph87/data/series/graph/Graph.java b/src/main/java/de/ph87/data/series/graph/Graph.java index c9762c2..9c720bb 100644 --- a/src/main/java/de/ph87/data/series/graph/Graph.java +++ b/src/main/java/de/ph87/data/series/graph/Graph.java @@ -72,8 +72,8 @@ public class Graph { // find bounds double vSum = 0; - double vMin = Double.MAX_VALUE; - double vMax = Double.MIN_VALUE; + double vMin = series.isGraphZero() ? 0.0 : Double.MAX_VALUE; + double vMax = series.isGraphZero() ? 0.0 : Double.MIN_VALUE; for (final GraphPoint point : points) { vMin = Math.min(vMin, point.getValue()); vMax = max(vMax, point.getValue()); @@ -81,7 +81,7 @@ public class Graph { } // auto scale - autoscale = new Autoscale(series.unit, vMin, vMax); + autoscale = new Autoscale(series, vMin, vMax); vMin *= autoscale.factor; vMax *= autoscale.factor; vSum *= autoscale.factor; diff --git a/src/main/java/de/ph87/data/value/Autoscale.java b/src/main/java/de/ph87/data/value/Autoscale.java index c235966..3ec2219 100644 --- a/src/main/java/de/ph87/data/value/Autoscale.java +++ b/src/main/java/de/ph87/data/value/Autoscale.java @@ -1,5 +1,6 @@ package de.ph87.data.value; +import de.ph87.data.series.*; import lombok.*; import java.util.*; @@ -14,14 +15,20 @@ public class Autoscale { @NonNull public final String unit; - public Autoscale(@NonNull final Unit sourceUnit, final double... values) { - final double abs = sourceUnit.factor * Arrays.stream(values).map(Math::abs).max().orElse(0); + public Autoscale(@NonNull final SeriesDto series, final double... values) { + if (!series.isGraphAutoscale()) { + this.factor = 1; + this.unit = series.unit.unit; + return; + } + + final double abs = series.unit.factor * Arrays.stream(values).map(Math::abs).max().orElse(0); final double exp = Math.max(0, Math.log10(abs)); final int group = (int) Math.floor(exp / 3); - this.factor = sourceUnit.factor * Math.pow(10, -group * 3); + this.factor = series.unit.factor * Math.pow(10, -group * 3); final int index = (SI_PREFIX.length - 1) / 2 + group; - this.unit = SI_PREFIX[index] + sourceUnit.base.unit; + this.unit = SI_PREFIX[index] + series.unit.base.unit; } @NonNull