//
// Copyright (C) 1998 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 library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library 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
+// This library 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.
+// Library 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.
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the
+// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+// Boston, MA 02111-1307, USA.
//
// $Id$
#include <simgear/compiler.h>
-#ifdef __MWERKS__
#include <stdlib.h> // for exit()
-#endif
#include STL_STRING
-#include <simgear/logstream.hxx>
-#include <simgear/fg_zlib.h>
-#include <simgear/fgstream.hxx>
+// depricated - #include <simgear/sg_zlib.h>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sgstream.hxx>
#include "interpolater.hxx"
+SG_USING_STD(string);
+
+// Constructor -- starts with an empty table.
+SGInterpTable::SGInterpTable()
+ : size(0)
+{
+}
+
// Constructor -- loads the interpolation table from the specified
// file
-fgINTERPTABLE::fgINTERPTABLE( const string& file ) {
- FG_LOG( FG_MATH, FG_INFO, "Initializing Interpolator for " << file );
-
- fg_gzifstream in( file );
- if ( !in ) {
- FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << file );
+SGInterpTable::SGInterpTable( const string& file )
+ : size(0)
+{
+ SG_LOG( SG_MATH, SG_INFO, "Initializing Interpolator for " << file );
+
+ sg_gzifstream in( file );
+ if ( !in.is_open() ) {
+ SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
exit(-1);
}
- size = 0;
in >> skipcomment;
while ( in ) {
- if ( size < MAX_TABLE_SIZE ) {
- in >> table[size][0] >> table[size][1];
- size++;
- } else {
- FG_LOG( FG_MATH, FG_ALERT,
- "fgInterpolateInit(): Exceed max table size = "
- << MAX_TABLE_SIZE );
- exit(-1);
- }
+ double ind, dep;
+ in >> ind >> dep;
+ in >> skipws;
+ table.push_back(Entry(ind, dep));
+ size++;
}
}
+// Add an entry to the table.
+void SGInterpTable::addEntry (double ind, double dep)
+{
+ table.push_back(Entry(ind,dep));
+ size++;
+}
+
+
// Given an x value, linearly interpolate the y value from the table
-double fgINTERPTABLE::interpolate(double x) {
+double SGInterpTable::interpolate(double x) const
+{
int i;
double y;
+ if (size == 0.0)
+ return 0.0;
+
i = 0;
- while ( (x > table[i][0]) && (i < size) ) {
+ while ( (i < size) && (x > table[i].ind) ) {
+ // cout << " i = " << i << " table[i].ind = " << table[i].ind << endl;
+ // cout << " size = " << size << endl;
i++;
}
// printf ("i = %d ", i);
- if ( (i == 0) && (x < table[0][0]) ) {
- FG_LOG( FG_MATH, FG_ALERT,
- "fgInterpolateInit(): lookup error, x to small = " << x );
- return(0.0);
+ if ( (i == 0) && (x < table[0].ind) ) {
+ SG_LOG( SG_MATH, SG_DEBUG,
+ "interpolate(): lookup error, x to small = " << x );
+ return table[0].dep;
}
- if ( x > table[i][0] ) {
- FG_LOG( FG_MATH, FG_ALERT,
- "fgInterpolateInit(): lookup error, x to big = " << x );
- return(0.0);
+ // cout << " table[size-1].ind = " << table[size-1].ind << endl;
+ if ( x > table[size-1].ind ) {
+ SG_LOG( SG_MATH, SG_DEBUG,
+ "interpolate(): lookup error, x to big = " << x );
+ return table[size-1].dep;
}
// y = y1 + (y0 - y1)(x - x1) / (x0 - x1)
- y = table[i][1] +
- ( (table[i-1][1] - table[i][1]) *
- (x - table[i][0]) ) /
- (table[i-1][0] - table[i][0]);
+ y = table[i].dep +
+ ( (table[i-1].dep - table[i].dep) *
+ (x - table[i].ind) ) /
+ (table[i-1].ind - table[i].ind);
return(y);
}
// Destructor
-fgINTERPTABLE::~fgINTERPTABLE( void ) {
+SGInterpTable::~SGInterpTable() {
}