]> git.mxchange.org Git - flightgear.git/blob - Lib/Math/interpolater.cxx
Removed plib from the source distribution. It must be built and installed
[flightgear.git] / Lib / Math / interpolater.cxx
1 //
2 // interpolater.cxx -- routines to handle linear interpolation from a table of
3 //                     x,y   The table must be sorted by "x" in ascending order
4 //
5 // Written by Curtis Olson, started April 1998.
6 //
7 // Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
8 //
9 // This program is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU General Public License as
11 // published by the Free Software Foundation; either version 2 of the
12 // License, or (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 // General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 //
23 // $Id$
24
25
26 #include <Include/compiler.h>
27
28 #include STL_STRING
29
30 #include <Debug/logstream.hxx>
31 #include <Include/fg_zlib.h>
32 #include <Misc/fgstream.hxx>
33
34 #include "interpolater.hxx"
35
36
37 // Constructor -- loads the interpolation table from the specified
38 // file
39 fgINTERPTABLE::fgINTERPTABLE( const string& file ) {
40     FG_LOG( FG_MATH, FG_INFO, "Initializing Interpolator for " << file );
41
42     fg_gzifstream in( file );
43     if ( !in ) {
44         FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << file );
45         exit(-1);
46     }
47
48     size = 0;
49     in >> skipcomment;
50     while ( ! in.eof() ){
51         if ( size < MAX_TABLE_SIZE ) {
52             in >> table[size][0] >> table[size][1];
53             size++;
54         } else {
55             FG_LOG( FG_MATH, FG_ALERT,
56                     "fgInterpolateInit(): Exceed max table size = "
57                     << MAX_TABLE_SIZE );
58             exit(-1);
59         }
60     }
61 }
62
63
64 // Given an x value, linearly interpolate the y value from the table
65 double fgINTERPTABLE::interpolate(double x) {
66     int i;
67     double y;
68
69     i = 0;
70
71     while ( (x > table[i][0]) && (i < size) ) {
72         i++;
73     }
74
75     // printf ("i = %d ", i);
76
77     if ( (i == 0) && (x < table[0][0]) ) {
78         FG_LOG( FG_MATH, FG_ALERT, 
79                 "fgInterpolateInit(): lookup error, x to small = " << x );
80         return(0.0);
81     }
82
83     if ( x > table[i][0] ) {
84         FG_LOG( FG_MATH, FG_ALERT, 
85                 "fgInterpolateInit(): lookup error, x to big = " << x );
86         return(0.0);
87     }
88
89     // y = y1 + (y0 - y1)(x - x1) / (x0 - x1)
90     y = table[i][1] + 
91         ( (table[i-1][1] - table[i][1]) * 
92           (x - table[i][0]) ) /
93         (table[i-1][0] - table[i][0]);
94
95     return(y);
96 }
97
98
99 // Destructor
100 fgINTERPTABLE::~fgINTERPTABLE( void ) {
101 }
102
103