1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.3
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
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.
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
16 // Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
17 // 4, 7, 10, or 13 vertices.
19 //----------------------------------------------------------------------------
21 #ifndef AGG_BEZIER_ARC_INCLUDED
22 #define AGG_BEZIER_ARC_INCLUDED
24 #include "agg_conv_transform.h"
29 //-----------------------------------------------------------------------
30 void arc_to_bezier(double cx
, double cy
, double rx
, double ry
,
31 double start_angle
, double sweep_angle
,
35 //==============================================================bezier_arc
37 // See implemantaion agg_bezier_arc.cpp
42 //--------------------------------------------------------------------
43 bezier_arc() : m_vertex(26) {}
44 bezier_arc(double x
, double y
,
49 init(x
, y
, rx
, ry
, start_angle
, sweep_angle
);
52 //--------------------------------------------------------------------
53 void init(double x
, double y
,
58 //--------------------------------------------------------------------
64 //--------------------------------------------------------------------
65 unsigned vertex(double* x
, double* y
)
67 if(m_vertex
>= m_num_vertices
) return path_cmd_stop
;
68 *x
= m_vertices
[m_vertex
];
69 *y
= m_vertices
[m_vertex
+ 1];
71 return (m_vertex
== 2) ? path_cmd_move_to
: path_cmd_curve4
;
74 // Supplemantary functions. num_vertices() actually returns doubled
75 // number of vertices. That is, for 1 vertex it returns 2.
76 //--------------------------------------------------------------------
77 unsigned num_vertices() const { return m_num_vertices
; }
78 const double* vertices() const { return m_vertices
; }
79 double* vertices() { return m_vertices
; }
83 unsigned m_num_vertices
;
84 double m_vertices
[26];
89 //==========================================================bezier_arc_svg
90 // Compute an SVG-style bezier arc.
92 // Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
93 // orientation of the ellipse are defined by two radii (rx, ry)
94 // and an x-axis-rotation, which indicates how the ellipse as a whole
95 // is rotated relative to the current coordinate system. The center
96 // (cx, cy) of the ellipse is calculated automatically to satisfy the
97 // constraints imposed by the other parameters.
98 // large-arc-flag and sweep-flag contribute to the automatic calculations
99 // and help determine how the arc is drawn.
103 //--------------------------------------------------------------------
104 bezier_arc_svg() : m_arc(), m_radii_ok(false) {}
106 bezier_arc_svg(double x1
, double y1
,
107 double rx
, double ry
,
111 double x2
, double y2
) :
112 m_arc(), m_radii_ok(false)
114 init(x1
, y1
, rx
, ry
, angle
, large_arc_flag
, sweep_flag
, x2
, y2
);
117 //--------------------------------------------------------------------
118 void init(double x1
, double y1
,
119 double rx
, double ry
,
123 double x2
, double y2
);
125 //--------------------------------------------------------------------
126 bool radii_ok() const { return m_radii_ok
; }
128 //--------------------------------------------------------------------
129 void rewind(unsigned)
134 //--------------------------------------------------------------------
135 unsigned vertex(double* x
, double* y
)
137 return m_arc
.vertex(x
, y
);
140 // Supplemantary functions. num_vertices() actually returns doubled
141 // number of vertices. That is, for 1 vertex it returns 2.
142 //--------------------------------------------------------------------
143 unsigned num_vertices() const { return m_arc
.num_vertices(); }
144 const double* vertices() const { return m_arc
.vertices(); }
145 double* vertices() { return m_arc
.vertices(); }