From f7b72f1ed133882f1d5a75ede5fe6b6fc4cbea1d Mon Sep 17 00:00:00 2001 From: Nicholas Guriev Date: Sat, 26 Feb 2022 20:11:25 +0300 Subject: [PATCH] =?UTF-8?q?Stop=20computing=20B=C3=A9zier=20curve=20length?= =?UTF-8?q?=20when=20float=20overflow=20occurs=20after=20splitting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vector/vbezier.cpp | 8 +++++++- src/vector/vbezier.h | 13 +++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 15889299..ea8745f9 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -52,7 +52,13 @@ float VBezier::length() const if ((len - chord) > 0.01) { VBezier left, right; split(&left, &right); - return left.length() + right.length(); + + float sum = 0; + if (*this != left) + sum += left.length(); + if (*this != right) + sum += right.length(); + return sum; } return len; diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 18b7c596..df18c4f9 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -23,11 +23,14 @@ #ifndef VBEZIER_H #define VBEZIER_H +#include #include V_BEGIN_NAMESPACE class VBezier { + friend bool operator == (const VBezier &l, const VBezier &r); + public: VBezier() = default; VPointF pointAt(float t) const; @@ -134,6 +137,16 @@ inline void VBezier::split(VBezier *firstHalf, VBezier *secondHalf) const firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2) * 0.5f; } +inline bool operator == (const VBezier &l, const VBezier &r) +{ + return std::tie(l.x1, l.y1, l.x2, l.y2, l.x3, l.y3, l.x4, l.y4) + == std::tie(r.x1, r.y1, r.x2, r.y2, r.x3, r.y3, r.x4, r.y4); +} +inline bool operator != (const VBezier &l, const VBezier &r) +{ + return !(l == r); +} + V_END_NAMESPACE #endif // VBEZIER_H