Series.graphAutoscale + Series.graphZero
This commit is contained in:
parent
13c4652244
commit
1f6e90aa68
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user