From af1bdbb198e7fcef6b996bd14168ee4bdde208fa Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 26 Sep 2007 11:33:10 +0100 Subject: [PATCH] [cairo-path-stroke] Correct the mitre limit derivation. MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit The first identity used in the derivation of the mitre limit is incorrect, namely secant(psi/2) ≠ 1/sin(psi/2) but secant(psi/2) = 1/cos(psi/2) instead. Update the derivation using the identity 2·cos²(psi/2) = 1+cos(psi) and arrive at the similar result 2 <= ml² (1 + in · out). (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=7245.) --- src/cairo-path-stroke.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/cairo-path-stroke.c b/src/cairo-path-stroke.c index d8d989b..1feda9d 100644 --- a/src/cairo-path-stroke.c +++ b/src/cairo-path-stroke.c @@ -284,13 +284,13 @@ _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_st * * where psi is the angle between in and out * - * secant(psi/2) = 1/sin(psi/2) - * 1/sin(psi/2) <= ml - * 1 <= ml sin(psi/2) - * 1 <= ml² sin²(psi/2) - * 2 <= ml² 2 sin²(psi/2) - * 2·sin²(psi/2) = 1-cos(psi) - * 2 <= ml² (1-cos(psi)) + * secant(psi/2) = 1/cos(psi/2) + * 1/cos(psi/2) <= ml + * 1 <= ml cos(psi/2) + * 1 <= ml² cos²(psi/2) + * 2 <= ml² 2 cos²(psi/2) + * 2·cos²(psi/2) = 1+cos(psi) + * 2 <= ml² (1+cos(psi)) * * in · out = |in| |out| cos (psi) * @@ -298,10 +298,10 @@ _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_st * * in · out = cos (psi) * - * 2 <= ml² (1 - in · out) + * 2 <= ml² (1 + in · out) * */ - if (2 <= ml * ml * (1 - in_dot_out)) { + if (2 <= ml * ml * (1 + in_dot_out)) { double x1, y1, x2, y2; double mx, my; double dx1, dx2, dy1, dy2; -- 1.5.2.5