------------------------------------------------------------------------
| 69 | |
| 70 | //------------------------------------------------------------------------ |
| 71 | void bezier_arc::init(double x, double y, |
| 72 | double rx, double ry, |
| 73 | double start_angle, |
| 74 | double sweep_angle) |
| 75 | { |
| 76 | start_angle = std::fmod(start_angle, 2.0 * pi); |
| 77 | if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; |
| 78 | if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; |
| 79 | |
| 80 | if(std::fabs(sweep_angle) < 1e-10) |
| 81 | { |
| 82 | m_num_vertices = 4; |
| 83 | m_cmd = path_cmd_line_to; |
| 84 | m_vertices[0] = x + rx * std::cos(start_angle); |
| 85 | m_vertices[1] = y + ry * std::sin(start_angle); |
| 86 | m_vertices[2] = x + rx * std::cos(start_angle + sweep_angle); |
| 87 | m_vertices[3] = y + ry * std::sin(start_angle + sweep_angle); |
| 88 | return; |
| 89 | } |
| 90 | |
| 91 | double total_sweep = 0.0; |
| 92 | double local_sweep = 0.0; |
| 93 | double prev_sweep; |
| 94 | m_num_vertices = 2; |
| 95 | m_cmd = path_cmd_curve4; |
| 96 | bool done = false; |
| 97 | do |
| 98 | { |
| 99 | if(sweep_angle < 0.0) |
| 100 | { |
| 101 | prev_sweep = total_sweep; |
| 102 | local_sweep = -pi * 0.5; |
| 103 | total_sweep -= pi * 0.5; |
| 104 | if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) |
| 105 | { |
| 106 | local_sweep = sweep_angle - prev_sweep; |
| 107 | done = true; |
| 108 | } |
| 109 | } |
| 110 | else |
| 111 | { |
| 112 | prev_sweep = total_sweep; |
| 113 | local_sweep = pi * 0.5; |
| 114 | total_sweep += pi * 0.5; |
| 115 | if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) |
| 116 | { |
| 117 | local_sweep = sweep_angle - prev_sweep; |
| 118 | done = true; |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | arc_to_bezier(x, y, rx, ry, |
| 123 | start_angle, |
| 124 | local_sweep, |
| 125 | m_vertices + m_num_vertices - 2); |
| 126 | |
| 127 | m_num_vertices += 6; |
| 128 | start_angle += local_sweep; |
nothing calls this directly
no test coverage detected