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

OpenGL

开发平台:

Visual C++

  1. // marker.h
  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 "marker.h"
  10. #include "gl.h"
  11. using namespace std;
  12. Marker::Marker(const Selection& s) :
  13.     m_object(s),
  14.     m_priority(0),
  15.     m_representation(MarkerRepresentation::Diamond),
  16.     m_occludable(true),
  17.     m_sizing(ConstantSize)
  18. {
  19. }
  20. Marker::~Marker()
  21. {
  22. }
  23. UniversalCoord Marker::position(double jd) const
  24. {
  25.     return m_object.getPosition(jd);
  26. }
  27. Selection Marker::object() const
  28. {
  29.     return m_object;
  30. }
  31. int Marker::priority() const
  32. {
  33.     return m_priority;
  34. }
  35. void Marker::setPriority(int priority)
  36. {
  37.     m_priority = priority;
  38. }
  39. void Marker::setRepresentation(const MarkerRepresentation& rep)
  40. {
  41.     m_representation = rep;
  42. }
  43. bool Marker::occludable() const
  44. {
  45.     return m_occludable;
  46. }
  47. void Marker::setOccludable(bool occludable)
  48. {
  49.     m_occludable = occludable;
  50. }
  51. MarkerSizing Marker::sizing() const
  52. {
  53.     return m_sizing;
  54. }
  55. void Marker::setSizing(MarkerSizing sizing)
  56. {
  57.     m_sizing = sizing;
  58. }
  59. void Marker::render(float size) const
  60. {
  61.     m_representation.render(m_sizing == DistanceBasedSize ? size : m_representation.size());
  62. }
  63. static void DrawCircle(float s)
  64. {
  65.     if (s < 1.0f)
  66.         s = 1.0f; //  0 and negative values are not allowed in the case of circle markers.
  67.     else if (s > 1024.0f)
  68.         s = 1024.0f; //  Bigger values would give a too high number of segments in the circle markers.
  69.     int step = (int) (60 / sqrt(s));
  70.     for (int i = 0; i < 360; i += step)
  71.     {
  72.         float degInRad = (float) (i * PI / 180);
  73.         glVertex3f((float) cos(degInRad) * s, (float) sin(degInRad) * s, 0.0f);
  74.     }
  75. }
  76. MarkerRepresentation::MarkerRepresentation(const MarkerRepresentation& rep) :
  77.     m_symbol(rep.m_symbol),
  78.     m_size(rep.m_size),
  79.     m_color(rep.m_color),
  80.     m_label(rep.m_label)
  81. {
  82. }
  83. MarkerRepresentation&
  84. MarkerRepresentation::operator=(const MarkerRepresentation& rep)
  85. {
  86.     m_symbol = rep.m_symbol;
  87.     m_size = rep.m_size;
  88.     m_color = rep.m_color;
  89.     m_label = rep.m_label;
  90.     
  91.     return *this;
  92. }
  93.     
  94.    
  95. void MarkerRepresentation::setColor(Color color)
  96. {
  97.     m_color = color;
  98. }
  99. void MarkerRepresentation::setSize(float size)
  100. {
  101.     m_size = size;
  102. }
  103. void MarkerRepresentation::setLabel(const std::string& label)
  104. {
  105.     m_label = label;
  106. }
  107. /*! Render the marker symbol at the specified size. The size is
  108.  *  the diameter of the marker in pixels.
  109.  */
  110. void MarkerRepresentation::render(float size) const
  111. {
  112.     float s = size / 2.0f;
  113.     switch (m_symbol)
  114.     {
  115.     case Diamond:
  116.         glBegin(GL_LINE_LOOP);
  117.         glVertex3f(0.0f,    s, 0.0f);
  118.         glVertex3f(   s, 0.0f, 0.0f);
  119.         glVertex3f(0.0f,   -s, 0.0f);
  120.         glVertex3f(  -s, 0.0f, 0.0f);
  121.         glEnd();
  122.         break;
  123.     case Plus:
  124.         glBegin(GL_LINES);
  125.         glVertex3f(0.0f,  s, 0.0f);
  126.         glVertex3f(0.0f, -s, 0.0f);
  127.         glVertex3f( s, 0.0f, 0.0f);
  128.         glVertex3f(-s, 0.0f, 0.0f);
  129.         glEnd();
  130.         break;
  131.     case X:
  132.         glBegin(GL_LINES);
  133.         glVertex3f(-s, -s, 0.0f);
  134.         glVertex3f( s,  s, 0.0f);
  135.         glVertex3f( s, -s, 0.0f);
  136.         glVertex3f(-s,  s, 0.0f);
  137.         glEnd();
  138.         break;
  139.     case Square:
  140.         glBegin(GL_LINE_LOOP);
  141.     case FilledSquare:
  142.         glBegin(GL_POLYGON);
  143.         glVertex3f(-s, -s, 0.0f);
  144.         glVertex3f( s, -s, 0.0f);
  145.         glVertex3f( s,  s, 0.0f);
  146.         glVertex3f(-s,  s, 0.0f);
  147.         glEnd();
  148.         break;
  149.     case Triangle:
  150.         glBegin(GL_LINE_LOOP);
  151.         glVertex3f(0.0f,  s, 0.0f);
  152.         glVertex3f(   s, -s, 0.0f);
  153.         glVertex3f(  -s, -s, 0.0f);
  154.         glEnd();
  155.         break;
  156.     case RightArrow:
  157.         glBegin(GL_POLYGON);
  158.         glVertex3f(-3*s, float(s/3), 0.0f);
  159.         glVertex3f(-3*s, float(-s/3), 0.0f);
  160.         glVertex3f(-2*s, float(-s/4), 0.0f);
  161.         glVertex3f(-2*s, float(s/4), 0.0f);
  162.         glEnd();
  163.         glBegin(GL_POLYGON);
  164.         glVertex3f(-2*s, float(2*s/3), 0.0f);
  165.         glVertex3f(-2*s, float(-2*s/3), 0.0f);
  166.         glVertex3f(-s, 0.0f, 0.0f);
  167.         glEnd();
  168.         break;
  169.     case LeftArrow:
  170.         glBegin(GL_POLYGON);
  171.         glVertex3f(3*s, float(-s/3), 0.0f);
  172.         glVertex3f(3*s, float(s/3), 0.0f);
  173.         glVertex3f(2*s, float(s/4), 0.0f);
  174.         glVertex3f(2*s, float(-s/4), 0.0f);
  175.         glEnd();
  176.         glBegin(GL_POLYGON);
  177.         glVertex3f(2*s, float(-2*s/3), 0.0f);
  178.         glVertex3f(2*s, float(2*s/3), 0.0f);
  179.         glVertex3f(s, 0.0f, 0.0f);
  180.         glEnd();
  181.         break;
  182.     case UpArrow:
  183.         glBegin(GL_POLYGON);
  184.         glVertex3f(float(-s/3), -3*s, 0.0f);
  185.         glVertex3f(float(s/3), -3*s, 0.0f);
  186.         glVertex3f(float(s/4), -2*s, 0.0f);
  187.         glVertex3f(float(-s/4), -2*s, 0.0f);
  188.         glEnd();
  189.         glBegin(GL_POLYGON);
  190.         glVertex3f(float(-2*s/3), -2*s, 0.0f);
  191.         glVertex3f(float(2*s/3), -2*s, 0.0f);
  192.         glVertex3f( 0.0f, -s, 0.0f);
  193.         glEnd();
  194.         break;
  195.     case DownArrow:
  196.         glBegin(GL_POLYGON);
  197.         glVertex3f(float(s/3), 3*s, 0.0f);
  198.         glVertex3f(float(-s/3), 3*s, 0.0f);
  199.         glVertex3f(float(-s/4), 2*s, 0.0f);
  200.         glVertex3f(float(s/4), 2*s, 0.0f);
  201.         glEnd();
  202.         glBegin(GL_POLYGON);
  203.         glVertex3f(float(2*s/3), 2*s, 0.0f);
  204.         glVertex3f(float(-2*s/3), 2*s, 0.0f);
  205.         glVertex3f( 0.0f, s, 0.0f);
  206.         glEnd();
  207.         break;
  208.     case Circle:
  209.         glBegin(GL_LINE_LOOP);
  210.         DrawCircle(s);
  211.         glEnd();    
  212.         break;
  213.             
  214.     case Disk:
  215.         glBegin(GL_POLYGON);
  216.         DrawCircle(s);
  217.         glEnd();
  218.         break;
  219.     }
  220. }