]> git.mxchange.org Git - simgear.git/blob - simgear/math/interpolater.cxx
SG-ified logstream.
[simgear.git] / simgear / 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 library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Library General Public
11 // License as published by the Free Software Foundation; either
12 // version 2 of the License, or (at your option) any later version.
13 //
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 // Library General Public License for more details.
18 //
19 // You should have received a copy of the GNU Library General Public
20 // License along with this library; if not, write to the
21 // Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 // Boston, MA  02111-1307, USA.
23 //
24 // $Id$
25
26
27 #include <simgear/compiler.h>
28
29 #include <stdlib.h> // for exit()
30
31 #include STL_STRING
32
33 #include <simgear/fg_zlib.h>
34 #include <simgear/debug/logstream.hxx>
35 #include <simgear/misc/fgstream.hxx>
36
37 #include "interpolater.hxx"
38
39 SG_USING_STD(string);
40
41
42 // Constructor -- loads the interpolation table from the specified
43 // file
44 SGInterpTable::SGInterpTable( const string& file ) {
45     SG_LOG( SG_MATH, SG_INFO, "Initializing Interpolator for " << file );
46
47     fg_gzifstream in( file );
48     if ( !in.is_open() ) {
49         SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
50         exit(-1);
51     }
52
53     size = 0;
54     in >> skipcomment;
55     while ( in ) {
56         if ( size < MAX_TABLE_SIZE ) {
57             in >> table[size][0] >> table[size][1];
58             in >> skipws;
59             size++;
60         } else {
61             SG_LOG( SG_MATH, SG_ALERT,
62                     "fgInterpolateInit(): Exceed max table size = "
63                     << MAX_TABLE_SIZE );
64             exit(-1);
65         }
66     }
67 }
68
69
70 // Given an x value, linearly interpolate the y value from the table
71 double SGInterpTable::interpolate(double x) {
72     int i;
73     double y;
74
75     i = 0;
76
77     while ( (x > table[i][0]) && (i < size) ) {
78         // cout << "  i = " << i << " table[i][0] = " << table[i][0] << endl;
79         // cout << "  size = " << size << endl;
80         i++;
81     }
82
83     // printf ("i = %d ", i);
84
85     if ( (i == 0) && (x < table[0][0]) ) {
86         SG_LOG( SG_MATH, SG_DEBUG, 
87                 "interpolate(): lookup error, x to small = " << x );
88         return table[0][1];
89     }
90
91     // cout << " table[size-1][0] = " << table[size-1][0] << endl;
92     if ( x > table[size-1][0] ) {
93         SG_LOG( SG_MATH, SG_DEBUG, 
94                 "interpolate(): lookup error, x to big = " << x );
95         return table[size-1][1];
96     }
97
98     // y = y1 + (y0 - y1)(x - x1) / (x0 - x1)
99     y = table[i][1] + 
100         ( (table[i-1][1] - table[i][1]) * 
101           (x - table[i][0]) ) /
102         (table[i-1][0] - table[i][0]);
103
104     return(y);
105 }
106
107
108 // Destructor
109 SGInterpTable::~SGInterpTable( void ) {
110 }
111
112