]> git.mxchange.org Git - flightgear.git/commitdiff
Globally-useful functions, starting with Alex Perry's low-pass
authordavid <david>
Fri, 27 Sep 2002 22:01:33 +0000 (22:01 +0000)
committerdavid <david>
Fri, 27 Sep 2002 22:01:33 +0000 (22:01 +0000)
function from steam.cxx.

src/Main/util.cxx [new file with mode: 0644]
src/Main/util.hxx [new file with mode: 0644]

diff --git a/src/Main/util.cxx b/src/Main/util.cxx
new file mode 100644 (file)
index 0000000..61e0681
--- /dev/null
@@ -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 <math.h>
+#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 (file)
index 0000000..91c34a1
--- /dev/null
@@ -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