📄 fgtable.cpp
字号:
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%unsigned int FGTable::FindNumColumns(string test_line){ // determine number of data columns in table (first column is row lookup - don't count) size_t position=0; unsigned int nCols=0; while ((position = test_line.find_first_not_of(" \t", position)) != string::npos) { nCols++; position = test_line.find_first_of(" \t", position); } return nCols;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTable::GetValue(void) const{ double temp = 0; double temp2 = 0; switch (Type) { case tt1D: temp = lookupProperty[eRow]->getDoubleValue(); temp2 = GetValue(temp); return temp2; case tt2D: return GetValue(lookupProperty[eRow]->getDoubleValue(), lookupProperty[eColumn]->getDoubleValue()); case tt3D: return GetValue(lookupProperty[eRow]->getDoubleValue(), lookupProperty[eColumn]->getDoubleValue(), lookupProperty[eTable]->getDoubleValue()); default: cerr << "Attempted to GetValue() for invalid/unknown table type" << endl; throw(string("Attempted to GetValue() for invalid/unknown table type")); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTable::GetValue(double key) const{ double Factor, Value, Span; unsigned int r = lastRowIndex; //if the key is off the end of the table, just return the //end-of-table value, do not extrapolate if( key <= Data[1][0] ) { lastRowIndex=2; //cout << "Key underneath table: " << key << endl; return Data[1][1]; } else if ( key >= Data[nRows][0] ) { lastRowIndex=nRows; //cout << "Key over table: " << key << endl; return Data[nRows][1]; } // the key is somewhere in the middle, search for the right breakpoint // The search is particularly efficient if // the correct breakpoint has not changed since last frame or // has only changed very little while (r > 2 && Data[r-1][0] > key) { r--; } while (r < nRows && Data[r][0] < key) { r++; } lastRowIndex=r; // make sure denominator below does not go to zero. Span = Data[r][0] - Data[r-1][0]; if (Span != 0.0) { Factor = (key - Data[r-1][0]) / Span; if (Factor > 1.0) Factor = 1.0; } else { Factor = 1.0; } Value = Factor*(Data[r][1] - Data[r-1][1]) + Data[r-1][1]; return Value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTable::GetValue(double rowKey, double colKey) const{ double rFactor, cFactor, col1temp, col2temp, Value; unsigned int r = lastRowIndex; unsigned int c = lastColumnIndex; while(r > 2 && Data[r-1][0] > rowKey) { r--; } while(r < nRows && Data[r] [0] < rowKey) { r++; } while(c > 2 && Data[0][c-1] > colKey) { c--; } while(c < nCols && Data[0][c] < colKey) { c++; } lastRowIndex=r; lastColumnIndex=c; rFactor = (rowKey - Data[r-1][0]) / (Data[r][0] - Data[r-1][0]); cFactor = (colKey - Data[0][c-1]) / (Data[0][c] - Data[0][c-1]); if (rFactor > 1.0) rFactor = 1.0; else if (rFactor < 0.0) rFactor = 0.0; if (cFactor > 1.0) cFactor = 1.0; else if (cFactor < 0.0) cFactor = 0.0; col1temp = rFactor*(Data[r][c-1] - Data[r-1][c-1]) + Data[r-1][c-1]; col2temp = rFactor*(Data[r][c] - Data[r-1][c]) + Data[r-1][c]; Value = col1temp + cFactor*(col2temp - col1temp); return Value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGTable::GetValue(double rowKey, double colKey, double tableKey) const{ double Factor, Value, Span; unsigned int r = lastRowIndex; //if the key is off the end (or before the beginning) of the table, // just return the boundary-table value, do not extrapolate if( tableKey <= Data[1][1] ) { lastRowIndex=2; return Tables[0]->GetValue(rowKey, colKey); } else if ( tableKey >= Data[nRows][1] ) { lastRowIndex=nRows; return Tables[nRows-1]->GetValue(rowKey, colKey); } // the key is somewhere in the middle, search for the right breakpoint // The search is particularly efficient if // the correct breakpoint has not changed since last frame or // has only changed very little while(r > 2 && Data[r-1][1] > tableKey) { r--; } while(r < nRows && Data[r] [1] < tableKey) { r++; } lastRowIndex=r; // make sure denominator below does not go to zero. Span = Data[r][1] - Data[r-1][1]; if (Span != 0.0) { Factor = (tableKey - Data[r-1][1]) / Span; if (Factor > 1.0) Factor = 1.0; } else { Factor = 1.0; } Value = Factor*(Tables[r-1]->GetValue(rowKey, colKey) - Tables[r-2]->GetValue(rowKey, colKey)) + Tables[r-2]->GetValue(rowKey, colKey); return Value;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGTable::operator<<(stringstream& in_stream){ int startRow=0; int startCol=0;// In 1D table, no pseudo-row of column-headers (i.e. keys): if (Type == tt1D) startRow = 1; for (unsigned int r=startRow; r<=nRows; r++) { for (unsigned int c=startCol; c<=nCols; c++) { if (r != 0 || c != 0) { in_stream >> Data[r][c]; } } }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGTable& FGTable::operator<<(const double n){ Data[rowCounter][colCounter] = n; if (colCounter == nCols) { colCounter = 0; rowCounter++; } else { colCounter++; } return *this;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGTable& FGTable::operator<<(const int n){ *this << (double)n; return *this;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGTable::Print(void){ int startRow=0; int startCol=0; if (Type == tt1D || Type == tt3D) startRow = 1; if (Type == tt3D) startCol = 1;#if defined (sgi) && !defined(__GNUC__) && (_COMPILER_VERSION < 740) unsigned long flags = cout.setf(ios::fixed);#else ios::fmtflags flags = cout.setf(ios::fixed); // set up output stream#endif switch(Type) { case tt1D: cout << " 1 dimensional table with " << nRows << " rows." << endl; break; case tt2D: cout << " 2 dimensional table with " << nRows << " rows, " << nCols << " columns." << endl; break; case tt3D: cout << " 3 dimensional table with " << nRows << " rows, " << nCols << " columns " << nTables << " tables." << endl; break; } cout.precision(4); for (unsigned int r=startRow; r<=nRows; r++) { cout << " "; for (unsigned int c=startCol; c<=nCols; c++) { if (r == 0 && c == 0) { cout << " "; } else { cout << Data[r][c] << " "; if (Type == tt3D) { cout << endl; Tables[r-1]->Print(); } } } cout << endl; } cout.setf(flags); // reset}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGTable::bind(void){ typedef double (FGTable::*PMF)(void) const; if ( !Name.empty() && !internal) { string tmp = PropertyManager->mkPropertyName(Name, false); // Allow upper PropertyManager->Tie( tmp, this, (PMF)&FGTable::GetValue); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// The bitmasked value choices are as follows:// unset: In this case (the default) JSBSim would only print// out the normally expected messages, essentially echoing// the config files as they are read. If the environment// variable is not set, debug_lvl is set to 1 internally// 0: This requests JSBSim not to output any messages// whatsoever.// 1: This value explicity requests the normal JSBSim// startup messages// 2: This value asks for a message to be printed out when// a class is instantiated// 4: When this value is set, a message is displayed when a// FGModel object executes its Run() method// 8: When this value is set, various runtime state variables// are printed out periodically// 16: When set various parameters are sanity checked and// a message is printed out when they go out of boundsvoid FGTable::Debug(int from){ if (debug_lvl <= 0) return; if (debug_lvl & 1) { // Standard console startup message output if (from == 0) { // Constructor } } if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (from == 0) cout << "Instantiated: FGTable" << endl; if (from == 1) cout << "Destroyed: FGTable" << endl; } if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects } if (debug_lvl & 8 ) { // Runtime state variables } if (debug_lvl & 16) { // Sanity checking } if (debug_lvl & 64) { if (from == 0) { // Constructor cout << IdSrc << endl; cout << IdHdr << endl; } }}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -