From 380450c95bc63470900288f36ef21a60339618af Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Thu, 15 Oct 2020 22:10:56 +0200 Subject: [PATCH] Bezier curve: introducing BEZIER_EPSILON BEZIER_EPSILON is used instead of EPSILON_FLT, because its value was to small causing in some cases an infinite loop. --- src/lib/tvgBezier.cpp | 6 +++--- src/lib/tvgBezier.h | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib/tvgBezier.cpp b/src/lib/tvgBezier.cpp index 06f593ea..8f6b26fb 100644 --- a/src/lib/tvgBezier.cpp +++ b/src/lib/tvgBezier.cpp @@ -74,7 +74,7 @@ float bezLength(const Bezier& cur) auto len = _lineLength(cur.start, cur.ctrl1) + _lineLength(cur.ctrl1, cur.ctrl2) + _lineLength(cur.ctrl2, cur.end); auto chord = _lineLength(cur.start, cur.end); - if (fabs(len - chord) > FLT_EPSILON) { + if (fabs(len - chord) > BEZIER_EPSILON) { bezSplit(cur, left, right); return bezLength(left) + bezLength(right); } @@ -124,7 +124,7 @@ float bezAt(const Bezier& bz, float at) bezSplitLeft(right, t, left); len = bezLength(left); - if (fabs(len - at) < FLT_EPSILON || fabs(smallest - biggest) < FLT_EPSILON) { + if (fabs(len - at) < BEZIER_EPSILON || fabs(smallest - biggest) < BEZIER_EPSILON) { break; } @@ -147,4 +147,4 @@ void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right) bezSplitLeft(right, t, left); } -} \ No newline at end of file +} diff --git a/src/lib/tvgBezier.h b/src/lib/tvgBezier.h index 89c80497..0a9e56a1 100644 --- a/src/lib/tvgBezier.h +++ b/src/lib/tvgBezier.h @@ -27,6 +27,8 @@ namespace tvg { +#define BEZIER_EPSILON 1e-4f + struct Bezier { Point start; @@ -43,4 +45,4 @@ void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right); } -#endif //_TVG_BEZIER_H_ \ No newline at end of file +#endif //_TVG_BEZIER_H_