/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.math; import com.badlogic.gdx.utils.StringBuilder; /** Track properties of a stream of float values. The properties (total value, minimum, etc) are updated as values are * {@link #put(float)} into the stream. * * @author xoppa */ public class FloatCounter { /** The amount of values added */ public int count; /** The sum of all values */ public float total; /** The smallest value */ public float min; /** The largest value */ public float max; /** The average value (total / count) */ public float average; /** The latest raw value */ public float latest; /** The current windowed mean value */ public float value; /** Provides access to the WindowedMean if any (can be null) */ public final WindowedMean mean; /** Construct a new FloatCounter * @param windowSize The size of the mean window or 1 or below to not use a windowed mean. */ public FloatCounter (int windowSize) { mean = (windowSize > 1) ? new WindowedMean(windowSize) : null; reset(); } /** Add a value and update all fields. * @param value The value to add */ public void put (float value) { latest = value; total += value; count++; average = total / count; if (mean != null) { mean.addValue(value); this.value = mean.getMean(); } else this.value = latest; if (mean == null || mean.hasEnoughData()) { if (this.value < min) min = this.value; if (this.value > max) max = this.value; } } /** Reset all values to their default value. */ public void reset () { count = 0; total = 0f; min = Float.MAX_VALUE; max = Float.MIN_VALUE; average = 0f; latest = 0f; value = 0f; if (mean != null) mean.clear(); } }