location.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:4k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // location.cpp
  2. //
  3. // Copyright (C) 2003, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <map>
  10. #include <celengine/location.h>
  11. #include <celengine/body.h>
  12. #include <celutil/util.h>
  13. using namespace std;
  14. static map<string, uint32> FeatureNameToFlag;
  15. static bool featureTableInitialized = false;
  16. struct FeatureNameEntry
  17. {
  18.     const char* name;
  19.     uint32 flag;
  20. };
  21. FeatureNameEntry FeatureNames[] =
  22. {
  23.     { "AA", Location::Crater },
  24.     { "VA", Location::Vallis },
  25.     { "MO", Location::Mons },
  26.     { "PM", Location::Planum },
  27.     { "CM", Location::Chasma },
  28.     { "PE", Location::Patera },
  29.     { "ME", Location::Mare },
  30.     { "RU", Location::Rupes },
  31.     { "TE", Location::Tessera },
  32.     { "RE", Location::Regio },
  33.     { "CH", Location::Chaos },
  34.     { "TA", Location::Terra },
  35.     { "AS", Location::Astrum },
  36.     { "CR", Location::Corona },
  37.     { "DO", Location::Dorsum },
  38.     { "FO", Location::Fossa },
  39.     { "CA", Location::Catena },
  40.     { "MN", Location::Mensa },
  41.     { "RI", Location::Rima },
  42.     { "UN", Location::Undae },
  43.     { "TH", Location::Tholus },
  44.     { "RT", Location::Reticulum },
  45.     { "PL", Location::Planitia },
  46.     { "LI", Location::Linea },
  47.     { "FL", Location::Fluctus },
  48.     { "FR", Location::Farrum },
  49.     { "LF", Location::LandingSite },
  50.     { "ER", Location::EruptiveCenter },
  51.     { "IN", Location::Insula },
  52.     { "XX", Location::Other },
  53.     { "City", Location::City },
  54.     { "Observatory", Location::Observatory },
  55.     { "Landing Site", Location::LandingSite },
  56.     { "Crater", Location::Crater },
  57. };
  58.  
  59. Location::Location() :
  60.     parent(NULL),
  61.     position(0.0f, 0.0f, 0.0f),
  62.     size(0.0f),
  63.     importance(-1.0f),
  64.     featureType(Other),
  65.     overrideLabelColor(false),
  66.     labelColor(1.0f, 1.0f, 1.0f),
  67.     infoURL(NULL)
  68. {
  69. }
  70. Location::~Location()
  71. {
  72.     if (infoURL != NULL)
  73.         delete infoURL;
  74. }
  75. string Location::getName(bool i18n) const
  76. {
  77.     if (!i18n || i18nName == "") return name;
  78.     return i18nName;
  79. }
  80. void Location::setName(const string& _name)
  81. {
  82.     name = _name;
  83.     i18nName = _(_name.c_str()); 
  84.     if (name == i18nName) i18nName = "";
  85. }
  86. Vec3f Location::getPosition() const
  87. {
  88.     return position;
  89. }
  90. void Location::setPosition(const Vec3f& _position)
  91. {
  92.     position = _position;
  93. }
  94. float Location::getSize() const
  95. {
  96.     return size;
  97. }
  98. void Location::setSize(float _size)
  99. {
  100.     size = _size;
  101. }
  102. float Location::getImportance() const
  103. {
  104.     return importance;
  105. }
  106. void Location::setImportance(float _importance)
  107. {
  108.     importance = _importance;
  109. }
  110. string Location::getInfoURL() const
  111. {
  112.     return "";
  113. }
  114. void Location::setInfoURL(const string&)
  115. {
  116. }
  117. uint32 Location::getFeatureType() const
  118. {
  119.     return featureType;
  120. }
  121. void Location::setFeatureType(uint32 _featureType)
  122. {
  123.     featureType = _featureType;
  124. }
  125. static void initFeatureTypeTable()
  126. {
  127.     featureTableInitialized = true;
  128.     for (int i = 0; i < (int)(sizeof(FeatureNames) / sizeof(FeatureNames[0])); i++)
  129.     {
  130.         FeatureNameToFlag[string(FeatureNames[i].name)] = FeatureNames[i].flag;
  131.     }
  132. }
  133. uint32 Location::parseFeatureType(const string& s)
  134. {
  135.     if (!featureTableInitialized)
  136.         initFeatureTypeTable();
  137.     int flag = FeatureNameToFlag[s];
  138.     return flag != 0 ? flag : (uint32) Other;
  139. }
  140. Body* Location::getParentBody() const
  141. {
  142.     return parent;
  143. }
  144. void Location::setParentBody(Body* _parent)
  145. {
  146.     parent = _parent;
  147. }
  148. /*! Get the position of the location relative to its body in 
  149.  *  the J2000 ecliptic coordinate system.
  150.  */
  151. Point3d Location::getPlanetocentricPosition(double t) const
  152. {
  153.     if (parent == NULL)
  154.         return Point3d(position.x, position.y, position.z);
  155.     Quatd q = parent->getEclipticToBodyFixed(t);
  156.     return Point3d(position.x, position.y, position.z) * q.toMatrix3();
  157. }
  158. Point3d Location::getHeliocentricPosition(double t) const
  159. {
  160.     if (parent == NULL)
  161.         return Point3d(position.x, position.y, position.z);
  162.     return parent->getAstrocentricPosition(t) +
  163.         (getPlanetocentricPosition(t) - Point3d(0.0, 0.0, 0.0));
  164. }