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

OpenGL

开发平台:

Visual C++

  1. // boundaries.cpp
  2. //
  3. // Copyright (C) 2002, 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 <cassert>
  10. #include <celengine/boundaries.h>
  11. #include <celengine/astro.h>
  12. #include <celengine/gl.h>
  13. #include <celengine/vecgl.h>
  14. using namespace std;
  15. static const float BoundariesDrawDistance = 10000.0f;
  16. ConstellationBoundaries::ConstellationBoundaries() :
  17.     currentChain(NULL)
  18. {
  19.     currentChain = new Chain();
  20.     currentChain->insert(currentChain->end(), Point3f(0.0f, 0.0f, 0.0f));
  21. }
  22. ConstellationBoundaries::~ConstellationBoundaries()
  23. {
  24.     for (vector<Chain*>::iterator iter = chains.begin();
  25.          iter != chains.end(); iter++)
  26.     {
  27.         delete *iter;
  28.     }
  29.     delete currentChain;
  30. }
  31. void ConstellationBoundaries::moveto(float ra, float dec)
  32. {
  33.     assert(currentChain != NULL);
  34.     Point3f p = astro::equatorialToCelestialCart(ra, dec, BoundariesDrawDistance);
  35.     if (currentChain->size() > 1)
  36.     {
  37.         chains.insert(chains.end(), currentChain);
  38.         currentChain = new Chain();
  39.         currentChain->insert(currentChain->end(), p);
  40.     }
  41.     else
  42.     {
  43.         (*currentChain)[0] = p;
  44.     }
  45. }
  46. void ConstellationBoundaries::lineto(float ra, float dec)
  47. {
  48.     currentChain->insert(currentChain->end(),
  49.                          astro::equatorialToCelestialCart(ra, dec, BoundariesDrawDistance));
  50. }
  51. void ConstellationBoundaries::render()
  52. {
  53.     for (vector<Chain*>::iterator iter = chains.begin();
  54.          iter != chains.end(); iter++)
  55.     {
  56.         Chain* chain = *iter;
  57.         glBegin(GL_LINE_STRIP);
  58.         for (Chain::iterator citer = chain->begin(); citer != chain->end();
  59.              citer++)
  60.         {
  61.             glVertex(*citer);
  62.         }
  63.         glEnd();
  64.     }
  65. }
  66. ConstellationBoundaries* ReadBoundaries(istream& in)
  67. {
  68.     ConstellationBoundaries* boundaries = new ConstellationBoundaries();
  69.     string lastCon;
  70.     int conCount = 0;
  71.     int ptCount = 0;
  72.     for (;;)
  73.     {
  74.         float ra = 0.0f;
  75.         float dec = 0.0f;
  76.         in >> ra;
  77.         if (!in.good())
  78.             break;
  79.         in >> dec;
  80.         string pt;
  81.         string con;
  82.         in >> con;
  83.         in >> pt;
  84.         if (!in.good())
  85.             break;
  86.         if (con != lastCon)
  87.         {
  88.             boundaries->moveto(ra, dec);
  89.             lastCon = con;
  90.             conCount++;
  91.         }
  92.         else
  93.         {
  94.             boundaries->lineto(ra, dec);
  95.         }
  96.         ptCount++;
  97.     }
  98.     return boundaries;
  99. }