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 20 #ifndef AGG_ELLIPSE_BRESENHAM_INCLUDED 21 #define AGG_ELLIPSE_BRESENHAM_INCLUDED 22 23 24 #include "agg_basics.h" 25 26 27 namespace agg 28 { 29 30 //------------------------------------------ellipse_bresenham_interpolator 31 class ellipse_bresenham_interpolator 32 { 33 public: 34 ellipse_bresenham_interpolator(int rx, int ry) : 35 m_rx2(rx * rx), 36 m_ry2(ry * ry), 37 m_two_rx2(m_rx2 << 1), 38 m_two_ry2(m_ry2 << 1), 39 m_dx(0), 40 m_dy(0), 41 m_inc_x(0), 42 m_inc_y(-ry * m_two_rx2), 43 m_cur_f(0) 44 {} 45 46 int dx() const { return m_dx; } 47 int dy() const { return m_dy; } 48 49 void operator++ () 50 { 51 int mx, my, mxy, min_m; 52 int fx, fy, fxy; 53 54 mx = fx = m_cur_f + m_inc_x + m_ry2; 55 if(mx < 0) mx = -mx; 56 57 my = fy = m_cur_f + m_inc_y + m_rx2; 58 if(my < 0) my = -my; 59 60 mxy = fxy = m_cur_f + m_inc_x + m_ry2 + m_inc_y + m_rx2; 61 if(mxy < 0) mxy = -mxy; 62 63 min_m = mx; 64 bool flag = true; 65 66 if(min_m > my) 67 { 68 min_m = my; 69 flag = false; 70 } 71 72 m_dx = m_dy = 0; 73 74 if(min_m > mxy) 75 { 76 m_inc_x += m_two_ry2; 77 m_inc_y += m_two_rx2; 78 m_cur_f = fxy; 79 m_dx = 1; 80 m_dy = 1; 81 return; 82 } 83 84 if(flag) 85 { 86 m_inc_x += m_two_ry2; 87 m_cur_f = fx; 88 m_dx = 1; 89 return; 90 } 91 92 m_inc_y += m_two_rx2; 93 m_cur_f = fy; 94 m_dy = 1; 95 } 96 97 private: 98 int m_rx2; 99 int m_ry2; 100 int m_two_rx2; 101 int m_two_ry2; 102 int m_dx; 103 int m_dy; 104 int m_inc_x; 105 int m_inc_y; 106 int m_cur_f; 107 108 }; 109 110 } 111 112 #endif 113 114