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

OpenGL

开发平台:

Visual C++

  1. // selection.cpp
  2. // 
  3. // Copyright (C) 2001-2008, 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 <cstdio>
  10. #include <cassert>
  11. #include "astro.h"
  12. #include "selection.h"
  13. #include "frametree.h"
  14. using namespace std;
  15. // Some velocities are computed by differentiation; units
  16. // are Julian days.
  17. static const double VELOCITY_DIFF_DELTA = 1.0 / 1440.0;
  18. double Selection::radius() const
  19. {
  20.     switch (type)
  21.     {
  22.     case Type_Star:
  23.         return star()->getRadius();
  24.     case Type_Body:
  25.         return body()->getRadius();
  26.     case Type_DeepSky:
  27.         return astro::lightYearsToKilometers(deepsky()->getRadius());
  28.     case Type_Location:
  29.         // The size of a location is its diameter, so divide by 2.
  30.         return location()->getSize() / 2.0f;
  31.     default:
  32.         return 0.0;
  33.     }
  34. }
  35. UniversalCoord Selection::getPosition(double t) const
  36. {
  37.     switch (type)
  38.     {
  39.     case Type_Body:
  40.         return body()->getPosition(t);
  41.         
  42.     case Type_Star:
  43.         return star()->getPosition(t);
  44.     case Type_DeepSky:
  45.         {
  46.             Point3d p = deepsky()->getPosition();
  47.             return astro::universalPosition(Point3d(0.0, 0.0, 0.0),
  48.                                             Point3f((float) p.x, (float) p.y, (float) p.z));
  49.         }
  50.         
  51.     case Type_Location:
  52.         {
  53.             Body* body = location()->getParentBody();
  54.             if (body != NULL)
  55.             {
  56.                 Point3d planetocentricPos = location()->getPlanetocentricPosition(t) *
  57.                     astro::kilometersToMicroLightYears(1.0);
  58.                 return body->getPosition(t) + planetocentricPos;
  59.             }
  60.             else
  61.             {
  62.                 // Bad location; all locations should have a parent.
  63.                 assert(0);
  64.                 return UniversalCoord(0.0, 0.0, 0.0);
  65.             }
  66.         }
  67.     default:
  68.         return UniversalCoord(Point3d(0.0, 0.0, 0.0));
  69.     }
  70. }
  71. Vec3d Selection::getVelocity(double t) const
  72. {
  73.     switch (type)
  74.     {
  75.     case Type_Body:
  76. return body()->getVelocity(t);
  77.         
  78.     case Type_Star:
  79.         return star()->getVelocity(t);
  80.     case Type_DeepSky:
  81. return Vec3d(0.0, 0.0, 0.0);
  82.     case Type_Location:
  83. {
  84. // For now, just use differentiation for location velocities.
  85. Vec3d ulyPerJD = (getPosition(t) - getPosition(t - VELOCITY_DIFF_DELTA)) * (1.0 / VELOCITY_DIFF_DELTA);
  86. return ulyPerJD * astro::microLightYearsToKilometers(1.0);
  87. }
  88.     default:
  89.         return Vec3d(0.0, 0.0, 0.0);
  90.     }
  91. }
  92. string Selection::getName(bool i18n) const
  93. {
  94.     switch (type)
  95.     {
  96.     case Type_Star:
  97.         {
  98.             char buf[20];
  99.             sprintf(buf, "#%d", star()->getCatalogNumber());
  100.             return string(buf);
  101.         }
  102.     case Type_DeepSky:
  103.         {
  104.             char buf[20];
  105.             sprintf(buf, "#%d", deepsky()->getCatalogNumber());
  106.             return string(buf);
  107.         }
  108.         
  109.     case Type_Body:
  110.         {
  111.             string name = body()->getName(i18n);
  112.             PlanetarySystem* system = body()->getSystem();
  113.             while (system != NULL)
  114.             {
  115.                 Body* parent = system->getPrimaryBody();
  116.                 if (parent != NULL)
  117.                 {
  118.                     name = parent->getName(i18n) + '/' + name;
  119.                     system = parent->getSystem();
  120.                 }
  121.                 else
  122.                 {
  123.                     const Star* parentStar = system->getStar();
  124.                     if (parentStar != NULL)
  125.                     {
  126.                         char buf[20];
  127.                         sprintf(buf, "#%d", parentStar->getCatalogNumber());
  128.                         name = string(buf) + '/' + name;
  129.                     }
  130.                     system = NULL;
  131.                 }
  132.             }
  133.             return name;
  134.         }
  135.     case Type_Location:
  136.         if (location()->getParentBody() == NULL)
  137.         {
  138.             return location()->getName(i18n);
  139.         }
  140.         else
  141.         {
  142.             return Selection(location()->getParentBody()).getName(i18n) + '/' +
  143.                 location()->getName(i18n);
  144.         }
  145.     default:
  146.         return "";
  147.     }
  148. }
  149. Selection Selection::parent() const
  150. {
  151.     switch (type)
  152.     {
  153.     case Type_Location:
  154.         return Selection(location()->getParentBody());
  155.     case Type_Body:
  156.         if (body()->getSystem())
  157.         {
  158.             if (body()->getSystem()->getPrimaryBody() != NULL)
  159.                 return Selection(body()->getSystem()->getPrimaryBody());
  160.             else
  161.                 return Selection(body()->getSystem()->getStar());
  162.         }
  163.         else
  164.         {
  165.             return Selection();
  166.         }
  167.         break;
  168.     case Type_Star:
  169.         return Selection(star()->getOrbitBarycenter());
  170.         
  171.     case Type_DeepSky:
  172.         // Currently no hierarchy for stars and deep sky objects.
  173.         return Selection();
  174.     default:
  175.         return Selection();
  176.     }
  177. }
  178. /*! Return true if the selection's visibility flag is set. */
  179. bool Selection::isVisible() const
  180. {
  181.     switch (type)
  182.     {
  183.     case Type_Body:
  184.         return body()->isVisible();
  185.     case Type_Star:
  186.         return true;
  187.     case Type_DeepSky:
  188.         return deepsky()->isVisible();
  189.     default:
  190.         return false;
  191.     }
  192. }