4REG_FIDDLE(SmoothBezierSplineInterpolation, 1024, 1024,
false, 0) {
24 std::unique_ptr<Scratch[]>
s(
new Scratch[n]);
28 s[0].r = {pts[0].
x() + 2 * pts[1].
x(), pts[0].
y() + 2 * pts[1].
y()};
29 for (
size_t i = 1; i < n - 1; ++i) {
33 s[i].r = {4 * pts[i].
x() + 2 * pts[i + 1].
x(), 4 * pts[i].
y() + 2 * pts[i + 1].
y()};
38 s[n - 1].r = {8 * pts[n - 1].
x() + pts[
N - 1].
x(), 8 * pts[n - 1].
y() + pts[
N - 1].
y()};
39 for (
size_t i = 1; i < n; i++) {
40 float mx =
s[i].a.
x() /
s[i - 1].b.
x();
41 float my =
s[i].a.
y() /
s[i - 1].b.
y();
42 s[i].b -= {mx *
s[i - 1].c.
x(), my *
s[i - 1].c.
y()};
43 s[i].r -= {mx *
s[i - 1].r.
x(), my *
s[i - 1].r.
y()};
45 s[n - 1].p = {
s[n - 1].r.
x() /
s[n - 1].b.
x(),
s[n - 1].r.
y() /
s[n - 1].b.
y()};
46 for (
int i = (
int)
N - 3; i >= 0; --i) {
47 s[i].p = {(
s[i].r.
x() -
s[i].c.
x() *
s[i + 1].p.fX) /
s[i].
b.
x(),
48 (
s[i].r.
y() -
s[i].c.
y() *
s[i + 1].p.fY) /
s[i].
b.
y()};
52 for (
size_t i = 0; i < n - 1; i++) {
53 SkPoint q = {2 * pts[i + 1].
x() -
s[i + 1].p.fX, 2 * pts[i + 1].
y() -
s[i + 1].p.fY};
54 path.cubicTo(
s[i].p, q, pts[i + 1]);
56 SkPoint q = {0.5f * (pts[
N - 1].
x() +
s[n - 1].p.
x()),
57 0.5f * (pts[
N - 1].
y() +
s[n - 1].p.
y())};
58 path.cubicTo(
s[n - 1].p, q, pts[n]);
72 {62, 511}, {162, 605}, {262, 610}, {362, 402}, {462, 959},
73 {562, 58}, {662, 272}, {762, 99}, {862, 759}, {962, 945},
76 canvas->
drawPath(MakeCubicSplineInterpolation(pts, std::size(pts)), p);