# [PATCH] [cairo-path-stroke] Correct the mitre limit derivation.

Chris Wilson chris at chris-wilson.co.uk
Wed Sep 26 03:33:10 PDT 2007

```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

--fd5uyaI9j6xoeUBo--
```