Skip to content

Commit f7b72f1

Browse files
committed
Stop computing Bézier curve length when float overflow occurs after splitting
1 parent 19fc8e9 commit f7b72f1

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/vector/vbezier.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ float VBezier::length() const
5252
if ((len - chord) > 0.01) {
5353
VBezier left, right;
5454
split(&left, &right);
55-
return left.length() + right.length();
55+
56+
float sum = 0;
57+
if (*this != left)
58+
sum += left.length();
59+
if (*this != right)
60+
sum += right.length();
61+
return sum;
5662
}
5763

5864
return len;

src/vector/vbezier.h

+13
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323
#ifndef VBEZIER_H
2424
#define VBEZIER_H
2525

26+
#include <tuple>
2627
#include <vpoint.h>
2728

2829
V_BEGIN_NAMESPACE
2930

3031
class VBezier {
32+
friend bool operator == (const VBezier &l, const VBezier &r);
33+
3134
public:
3235
VBezier() = default;
3336
VPointF pointAt(float t) const;
@@ -134,6 +137,16 @@ inline void VBezier::split(VBezier *firstHalf, VBezier *secondHalf) const
134137
firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2) * 0.5f;
135138
}
136139

140+
inline bool operator == (const VBezier &l, const VBezier &r)
141+
{
142+
return std::tie(l.x1, l.y1, l.x2, l.y2, l.x3, l.y3, l.x4, l.y4)
143+
== std::tie(r.x1, r.y1, r.x2, r.y2, r.x3, r.y3, r.x4, r.y4);
144+
}
145+
inline bool operator != (const VBezier &l, const VBezier &r)
146+
{
147+
return !(l == r);
148+
}
149+
137150
V_END_NAMESPACE
138151

139152
#endif // VBEZIER_H

0 commit comments

Comments
 (0)