⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fgtable.cpp

📁 6 DOF Missle Simulation
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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 + -