/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.graphene; import java.util.List; import org.diirt.util.array.ArrayDouble; import java.time.Duration; import org.diirt.util.time.TimeDuration; import org.diirt.util.time.TimeInterval; import java.time.Instant; import java.time.temporal.ChronoUnit; /** * A time scale where absolute time is used linearly. * * @author carcassi */ final class LinearAbsoluteTimeScale implements TimeScale { @Override public double scaleNormalizedTime(double value, double newMinValue, double newMaxValue) { double newRange = newMaxValue - newMinValue; return newMinValue + (value) * newRange; } @Override public double scaleTimestamp(Instant value, TimeInterval timeInterval, double newMinValue, double newMaxValue) { double fromStart = timeInterval.getStart().until(value, ChronoUnit.SECONDS); double range = timeInterval.getStart().until(timeInterval.getEnd(), ChronoUnit.SECONDS); double newRange = newMaxValue - newMinValue; return newMinValue + (fromStart) / range * newRange; } @Override public TimeAxis references(TimeInterval range, int minRefs, int maxRefs) { // Validate input. Make sure requested references range makes sense. if ( (maxRefs < minRefs) || (minRefs < 0 ) || (maxRefs < 0) ) { throw new IllegalArgumentException( "Invalid references range: " + minRefs + " < # references < " + maxRefs ); } // First guess at the time between references. // Get the smallest required period, and then round down double minPeriodInSec; if( maxRefs == 0){ minPeriodInSec = 0.0; }else{ minPeriodInSec = range.getStart().until(range.getEnd(), ChronoUnit.SECONDS) / maxRefs; } TimeScales.TimePeriod timePeriod = TimeScales.toTimePeriod(minPeriodInSec); timePeriod = TimeScales.nextDown(timePeriod); // Keep increasing the time until you have the right amount of references List<Instant> references = TimeScales.createReferences(range, timePeriod); while(references.size() > maxRefs) { timePeriod = TimeScales.nextUp(timePeriod); references = TimeScales.createReferences(range, timePeriod); } if (references.size() < minRefs) { throw new RuntimeException("Can't create the requested amount of references. Could only create: " + references.size() + ", minimum required: " + minRefs ); } // Prepare normalized values double[] normalized = new double[references.size()]; for (int i = 0; i < references.size(); i++) { normalized[i] = TimeScales.normalize(references.get(i), range); } ArrayDouble normalizedValues = new ArrayDouble(normalized); return new TimeAxis(range, references, normalizedValues, TimeScales.trimLabels(TimeScales.createLabels(references))); } }