agg_ellipse_bresenham.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //----------------------------------------------------------------------------
  2. // Anti-Grain Geometry - Version 2.4
  3. // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
  4. //
  5. // Permission to copy, use, modify, sell and distribute this software
  6. // is granted provided this copyright notice appears in all copies.
  7. // This software is provided "as is" without express or implied
  8. // warranty, and with no claim as to its suitability for any purpose.
  9. //
  10. //----------------------------------------------------------------------------
  11. // Contact: mcseem@antigrain.com
  12. // mcseemagg@yahoo.com
  13. // http://www.antigrain.com
  14. //----------------------------------------------------------------------------
  15. //
  16. // Simple Bresenham interpolator for ellipsees
  17. //
  18. //----------------------------------------------------------------------------
  19. #ifndef AGG_ELLIPSE_BRESENHAM_INCLUDED
  20. #define AGG_ELLIPSE_BRESENHAM_INCLUDED
  21. #include "agg_basics.h"
  22. namespace agg
  23. {
  24. //------------------------------------------ellipse_bresenham_interpolator
  25. class ellipse_bresenham_interpolator
  26. {
  27. public:
  28. ellipse_bresenham_interpolator(int rx, int ry) :
  29. m_rx2(rx * rx),
  30. m_ry2(ry * ry),
  31. m_two_rx2(m_rx2 << 1),
  32. m_two_ry2(m_ry2 << 1),
  33. m_dx(0),
  34. m_dy(0),
  35. m_inc_x(0),
  36. m_inc_y(-ry * m_two_rx2),
  37. m_cur_f(0)
  38. {}
  39. int dx() const { return m_dx; }
  40. int dy() const { return m_dy; }
  41. void operator++ ()
  42. {
  43. int mx, my, mxy, min_m;
  44. int fx, fy, fxy;
  45. mx = fx = m_cur_f + m_inc_x + m_ry2;
  46. if(mx < 0) mx = -mx;
  47. my = fy = m_cur_f + m_inc_y + m_rx2;
  48. if(my < 0) my = -my;
  49. mxy = fxy = m_cur_f + m_inc_x + m_ry2 + m_inc_y + m_rx2;
  50. if(mxy < 0) mxy = -mxy;
  51. min_m = mx;
  52. bool flag = true;
  53. if(min_m > my)
  54. {
  55. min_m = my;
  56. flag = false;
  57. }
  58. m_dx = m_dy = 0;
  59. if(min_m > mxy)
  60. {
  61. m_inc_x += m_two_ry2;
  62. m_inc_y += m_two_rx2;
  63. m_cur_f = fxy;
  64. m_dx = 1;
  65. m_dy = 1;
  66. return;
  67. }
  68. if(flag)
  69. {
  70. m_inc_x += m_two_ry2;
  71. m_cur_f = fx;
  72. m_dx = 1;
  73. return;
  74. }
  75. m_inc_y += m_two_rx2;
  76. m_cur_f = fy;
  77. m_dy = 1;
  78. }
  79. private:
  80. int m_rx2;
  81. int m_ry2;
  82. int m_two_rx2;
  83. int m_two_ry2;
  84. int m_dx;
  85. int m_dy;
  86. int m_inc_x;
  87. int m_inc_y;
  88. int m_cur_f;
  89. };
  90. }
  91. #endif