From 84d2627236ffa2134378b9a66b0e5236df8b54eb Mon Sep 17 00:00:00 2001 From: david Date: Fri, 27 Sep 2002 22:01:33 +0000 Subject: [PATCH] Globally-useful functions, starting with Alex Perry's low-pass function from steam.cxx. --- src/Main/util.cxx | 53 +++++++++++++++++++++++++++++++++++++++++++++++ src/Main/util.hxx | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/Main/util.cxx create mode 100644 src/Main/util.hxx diff --git a/src/Main/util.cxx b/src/Main/util.cxx new file mode 100644 index 000000000..61e068165 --- /dev/null +++ b/src/Main/util.cxx @@ -0,0 +1,53 @@ +// util.cxx - general-purpose utility functions. +// Copyright (C) 2002 Curtis L. Olson - curt@me.umn.edu +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#include +#include "util.hxx" + + +// Originally written by Alex Perry. +double +fgGetLowPass (double current, double target, double timeratio) +{ + if ( timeratio < 0.0 ) { + if ( timeratio < -1.0 ) { + // time went backwards; kill the filter + current = target; + } else { + // ignore mildly negative time + } + } else if ( timeratio < 0.2 ) { + // Normal mode of operation; fast + // approximation to exp(-timeratio) + current = current * (1.0 - timeratio) + target * timeratio; + } else if ( timeratio > 5.0 ) { + // Huge time step; assume filter has settled + current = target; + } else { + // Moderate time step; non linear response + double keep = exp(-timeratio); + current = current * keep + target * (1.0 - keep); + } + + return current; +} + +// end of util.cxx + diff --git a/src/Main/util.hxx b/src/Main/util.hxx new file mode 100644 index 000000000..91c34a1b9 --- /dev/null +++ b/src/Main/util.hxx @@ -0,0 +1,43 @@ +// util.hxx - general-purpose utility functions. +// Copyright (C) 2002 Curtis L. Olson - curt@me.umn.edu +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + + +#ifndef __UTIL_HXX +#define __UTIL_HXX 1 + +#ifndef __cplusplus +# error This library requires C++ +#endif + + +/** + * Move a value towards a target. + * + * This function was originally written by Alex Perry. + * + * @param current The current value. + * @param target The target value. + * @param timeratio The percentage of smoothing time that has passed + * (elapsed time/smoothing time) + * @return The new value. + */ +extern double fgGetLowPass (double current, double target, double timeratio); + + +#endif // __UTIL_HXX -- 2.39.5