Lines Matching refs:arc

27 #include "arc.h"
165 try_to_fix_radii(struct arc *arc)
171 rot = DEGREES_TO_RADIANS(arc->theta);
178 x0p = (arc->x1*COS + arc->y1*SIN)/arc->a;
179 y0p = (-arc->x1*SIN + arc->y1*COS)/arc->b;
180 x1p = (arc->x2*COS + arc->y2*SIN)/arc->a;
181 y1p = (-arc->x2*SIN + arc->y2*COS)/arc->b;
193 arc->a *= scale;
194 arc->b *= scale;
226 static VGboolean find_angles(struct arc *arc)
233 if (floatIsZero(arc->a) || floatIsZero(arc->b)) {
238 matrix_scale(&matrix, 1.f, arc->a/arc->b);
239 matrix_rotate(&matrix, -arc->theta);
241 arc->x1, arc->y1,
242 &arc->x1, &arc->y1);
244 arc->x2, arc->y2,
245 &arc->x2, &arc->y2);
247 arc->cx, arc->cy,
248 &arc->cx, &arc->cy);
256 arc->x1, arc->y1, arc->x2, arc->y2);
259 vec0[0] = arc->x1 - arc->cx;
260 vec0[1] = arc->y1 - arc->cy;
261 vec1[0] = arc->x2 - arc->cx;
262 vec1[1] = arc->y2 - arc->cy;
266 vec0[0], vec0[1], vec1[0], vec1[1], arc->cx, arc->cy);
274 if (arc->type == VG_SCWARC_TO ||
275 arc->type == VG_SCCWARC_TO)
277 else if (arc->type == VG_LCWARC_TO ||
278 arc->type == VG_LCCWARC_TO) {
287 if (arc->type == VG_SCWARC_TO ||
288 arc->type == VG_LCWARC_TO)
298 arc->eta1 = atan2(sin(lambda1) / arc->b,
299 cos(lambda1) / arc->a);
300 arc->eta2 = atan2(sin(lambda2) / arc->b,
301 cos(lambda2) / arc->a);
304 arc->eta2 -= two_pi * floor((arc->eta2 - arc->eta1) / two_pi);
308 if ((lambda2 - lambda1 > M_PI) && (arc->eta2 - arc->eta1 < M_PI)) {
309 arc->eta2 += 2 * M_PI;
312 arc->eta1 = lambda1;
313 arc->eta2 = lambda2;
320 static void check_endpoints(struct arc *arc)
324 double a_cos_eta1 = arc->a * cos(arc->eta1);
325 double b_sin_eta1 = arc->b * sin(arc->eta1);
326 x1 = arc->cx + a_cos_eta1 * arc->cos_theta -
327 b_sin_eta1 * arc->sin_theta;
328 y1 = arc->cy + a_cos_eta1 * arc->sin_theta +
329 b_sin_eta1 * arc->cos_theta;
331 double a_cos_eta2 = arc->a * cos(arc->eta2);
332 double b_sin_eta2 = arc->b * sin(arc->eta2);
333 x2 = arc->cx + a_cos_eta2 * arc->cos_theta -
334 b_sin_eta2 * arc->sin_theta;
335 y2 = arc->cy + a_cos_eta2 * arc->sin_theta +
336 b_sin_eta2 * arc->cos_theta;
341 arc->x1, arc->y1,
342 arc->x2, arc->y2);
346 void arc_init(struct arc *arc,
357 arc->type = type;
358 arc->x1 = x1;
359 arc->y1 = y1;
360 arc->x2 = x2;
361 arc->y2 = y2;
362 arc->a = rh;
363 arc->b = rv;
364 arc->theta = rot;
365 arc->cos_theta = cos(arc->theta);
366 arc->sin_theta = sin(arc->theta);
370 arc->is_valid = find_ellipses(rh, rv, rot, x1, y1, x2, y2,
373 if (!arc->is_valid && try_to_fix_radii(arc)) {
374 rh = arc->a;
375 rv = arc->b;
376 arc->is_valid =
393 arc->cx = cx;
394 arc->cy = cy;
395 if (arc->is_valid) {
396 arc->is_valid = find_angles(arc);
398 check_endpoints(arc);
405 arc->theta = DEGREES_TO_RADIANS(rot);
406 arc->cos_theta = cos(arc->theta);
407 arc->sin_theta = sin(arc->theta);
408 arc->cx = cx;
409 arc->cy = cy;
419 static double estimate_error(struct arc *arc,
424 double x = arc->b / arc->a;
447 return rational_function(x, safety) * arc->a * exp(c0 + c1 * dEta);
525 static INLINE int num_beziers_needed(struct arc *arc)
532 min_eta = MIN2(arc->eta1, arc->eta2);
533 max_eta = MAX2(arc->eta1, arc->eta2);
544 found = (estimate_error(arc, etaA, eta_b) <= threshold);
553 static void arc_to_beziers(struct arc *arc,
564 { /* always move to the start of the arc */
565 VGfloat x = arc->x1;
566 VGfloat y = arc->y1;
571 if (!arc->is_valid) {
572 VGfloat x = arc->x2;
573 VGfloat y = arc->y2;
580 n = num_beziers_needed(arc);
582 d_eta = (arc->eta2 - arc->eta1) / n;
583 eta_b = arc->eta1;
587 a_cos_eta_b = arc->a * cos_eta_b;
588 b_sin_eta_b = arc->b * sin_eta_b;
589 a_sin_eta_b = arc->a * sin_eta_b;
590 b_cos_eta_b = arc->b * cos_eta_b;
591 x_b = arc->cx + a_cos_eta_b * arc->cos_theta -
592 b_sin_eta_b * arc->sin_theta;
593 y_b = arc->cy + a_cos_eta_b * arc->sin_theta +
594 b_sin_eta_b * arc->cos_theta;
595 x_b_dot = -a_sin_eta_b * arc->cos_theta -
596 b_cos_eta_b * arc->sin_theta;
597 y_b_dot = -a_sin_eta_b * arc->sin_theta +
598 b_cos_eta_b * arc->cos_theta;
621 a_cos_eta_b = arc->a * cos_eta_b;
622 b_sin_eta_b = arc->b * sin_eta_b;
623 a_sin_eta_b = arc->a * sin_eta_b;
624 b_cos_eta_b = arc->b * cos_eta_b;
625 x_b = arc->cx + a_cos_eta_b * arc->cos_theta -
626 b_sin_eta_b * arc->sin_theta;
627 y_b = arc->cy + a_cos_eta_b * arc->sin_theta +
628 b_sin_eta_b * arc->cos_theta;
629 x_b_dot = -a_sin_eta_b * arc->cos_theta -
630 b_cos_eta_b * arc->sin_theta;
631 y_b_dot = -a_sin_eta_b * arc->sin_theta +
632 b_cos_eta_b * arc->cos_theta;
655 void arc_add_to_polygon(struct arc *arc,
666 arc_to_beziers(arc, cb, matrix);
669 void arc_stroke_cb(struct arc *arc,
680 arc_to_beziers(arc, cb, matrix);
683 void arc_stroker_emit(struct arc *arc,
694 arc_to_beziers(arc, cb, matrix);
697 void arc_to_path(struct arc *arc,
708 arc_to_beziers(arc, cb, matrix);