16 return p0 + t * (p1 - p0);
20 return (1 - t) * (1 - t) * p0 +
21 2 * (1 - t) * t * p1 +
29 return 2 * (1 - t) * (p1 - p0) +
38 return (1 - t) * (1 - t) * (1 - t) * p0 +
39 3 * (1 - t) * (1 - t) * t * p1 +
40 3 * (1 - t) * t * t * p2 +
49 return -3 * p0 * (1 - t) * (1 - t) +
50 p1 * (3 * (1 - t) * (1 - t) - 6 * (1 - t) * t) +
51 p2 * (6 * (1 - t) * t - 3 * t * t) +
74 return (
p1 -
p2).Normalize();
81 return (
p2 -
p1).Normalize();
100 return x / (1.0 - d + sqrt(sqrt(pow(d, 4) + 0.25 * x * x)));
104 std::vector<Point> points;
110 Scalar scale_factor)
const {
112 auto sqrt_tolerance = sqrt(tolerance);
117 auto cross = (
p2 -
p1).Cross(dd);
118 auto x0 = d01.
Dot(dd) * 1 / cross;
119 auto x2 = d12.Dot(dd) * 1 / cross;
120 auto scale = std::abs(cross / (hypot(dd.x, dd.y) * (x2 - x0)));
125 if (std::isfinite(scale)) {
126 auto da = std::abs(a2 - a0);
127 auto sqrt_scale = sqrt(scale);
128 if ((x0 < 0 && x2 < 0) || (x0 >= 0 && x2 >= 0)) {
129 val = da * sqrt_scale;
132 auto xmin = sqrt_tolerance / sqrt_scale;
138 auto uscale = 1 / (u2 - u0);
140 auto line_count = std::max(1., ceil(0.5 * val / sqrt_tolerance));
141 auto step = 1 / line_count;
142 for (
size_t i = 1; i < line_count; i += 1) {
144 auto a = a0 + (a2 - a0) * u;
146 points.emplace_back(
Solve(t));
148 points.emplace_back(
p2);
158 return (
p1 -
cp).Normalize();
161 return (
p1 -
p2).Normalize();
168 return (
p2 -
cp).Normalize();
171 return (
p2 -
p1).Normalize();
192 std::vector<Point> points;
193 for (
const auto& quad : quads) {
194 quad.FillPointsForPolyline(points, scale);
208 auto scale = (t1 - t0) * (1.0 / 3.0);
209 auto p1 = p0 + scale * d.Solve(t0);
210 auto p2 = p3 - scale * d.Solve(t1);
214 std::vector<QuadraticPathComponent>
216 std::vector<QuadraticPathComponent> quads;
228 auto max_hypot2 = 432.0 * accuracy * accuracy;
229 auto p1x2 = 3.0 *
cp1 -
p1;
230 auto p2x2 = 3.0 *
cp2 -
p2;
231 auto p = p2x2 - p1x2;
233 auto quad_count = std::max(1., ceil(pow(err / max_hypot2, 1. / 6.0)));
235 for (
size_t i = 0; i < quad_count; i++) {
236 auto t0 = i / quad_count;
237 auto t1 = (i + 1) / quad_count;
239 auto p1x2 = 3.0 * seg.cp1 - seg.p1;
240 auto p2x2 = 3.0 * seg.cp2 - seg.p2;
248 return (a > (b - epsilon)) && (a < (b + epsilon));
260 const Scalar a = 3.0 * (-p1 + 3.0 * p2 - 3.0 * p3 + p4);
261 const Scalar b = 6.0 * (p1 - 2.0 * p2 + p3);
262 const Scalar c = 3.0 * (p2 - p1);
273 if (t >= 0.0 && t <= 1.0) {
274 values.emplace_back(t);
279 Scalar b2Minus4AC = (b * b) - (4.0 * a * c);
281 if (b2Minus4AC < 0.0) {
285 Scalar rootB2Minus4AC = ::sqrt(b2Minus4AC);
293 Scalar q = (b < 0) ? -(b - rootB2Minus4AC) / 2 : -(b + rootB2Minus4AC) / 2;
297 if (t >= 0.0 && t <= 1.0) {
298 values.emplace_back(t);
304 if (t >= 0.0 && t <= 1.0) {
305 values.emplace_back(t);
314 std::vector<Scalar> values;
319 std::vector<Point> points = {
p1,
p2};
321 for (
const auto& value : values) {
322 points.emplace_back(
Solve(value));
330 return (
p1 -
cp1).Normalize();
333 return (
p1 -
cp2).Normalize();
336 return (
p1 -
p2).Normalize();
343 return (
p2 -
cp2).Normalize();
346 return (
p2 -
cp1).Normalize();
349 return (
p2 -
p1).Normalize();