* Based on snap.svg bezlen() function * https://github.com/adobe-webplatform/Snap.svg/blob/master/dist/snap.svg.js#L5786
(p0, cp1, cp2, p, t = 1)
| 70 | * https://github.com/adobe-webplatform/Snap.svg/blob/master/dist/snap.svg.js#L5786 |
| 71 | */ |
| 72 | function cubicBezierLength(p0, cp1, cp2, p, t = 1) { |
| 73 | if (t === 0) { |
| 74 | return 0; |
| 75 | } |
| 76 | const base3 = (t, p1, p2, p3, p4) => { |
| 77 | const t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, |
| 78 | t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; |
| 79 | return t * t2 - 3 * p1 + 3 * p2; |
| 80 | }; |
| 81 | t = t > 1 ? 1 : t < 0 ? 0 : t; |
| 82 | const t2 = t / 2; |
| 83 | const Tvalues = [-.1252, .1252, -.3678, .3678, -.5873, .5873, -.7699, .7699, -.9041, .9041, -.9816, .9816]; |
| 84 | const Cvalues = [0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069, 0.1069, 0.0472, 0.0472]; |
| 85 | |
| 86 | |
| 87 | const n = Tvalues.length; |
| 88 | let sum = 0; |
| 89 | for (let i = 0; i < n; i++) { |
| 90 | const ct = t2 * Tvalues[i] + t2, |
| 91 | xbase = base3(ct, p0[0], cp1[0], cp2[0], p[0]), |
| 92 | ybase = base3(ct, p0[1], cp1[1], cp2[1], p[1]), |
| 93 | comb = xbase * xbase + ybase * ybase; |
| 94 | sum += Cvalues[i] * Math.sqrt(comb); |
| 95 | } |
| 96 | return t2 * sum; |
| 97 | } |
| 98 | |
| 99 | function clamp(value, min, max) { |
| 100 | return Math.min(Math.max(value, min), max); |