Series.graphAutoscale + Series.graphZero

This commit is contained in:
Patrick Haßel 2025-02-25 12:06:35 +01:00
parent 13c4652244
commit 1f6e90aa68
4 changed files with 26 additions and 7 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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