19 using System.Collections.Generic;
27 internal static class SmoothSpline
29 public static Point[] SmoothSplines(Point[] points)
31 double[] x = (from el in points select el.X).ToArray();
32 double[] y = (from el in points select el.Y).ToArray();
34 (
double[] p1,
double[] p2) px = ComputeControlPoints(x);
35 (
double[] p1,
double[] p2) py = ComputeControlPoints(y);
37 List<Point> tbr =
new List<Point>();
39 for (
int i = 0; i < points.Length - 1; i++)
41 tbr.Add(
new Point(x[i], y[i]));
42 tbr.Add(
new Point(px.p1[i], py.p1[i]));
43 tbr.Add(
new Point(px.p2[i], py.p2[i]));
46 tbr.Add(
new Point(x[x.Length - 1], y[x.Length - 1]));
52 private static (
double[] p1,
double[] p2) ComputeControlPoints(
double[] K)
57 double[] p1 =
new double[n];
58 double[] p2 =
new double[n];
62 double[] a =
new double[n];
63 double[] b =
new double[n];
64 double[] c =
new double[n];
65 double[] r =
new double[n];
71 r[0] = K[0] + 2 * K[1];
74 for (
int i = 1; i < n - 1; i++)
79 r[i] = 4 * K[i] + 2 * K[i + 1];
86 r[n - 1] = 8 * K[n - 1] + K[n];
89 for (
int i = 1; i < n; i++)
91 double m = a[i] / b[i - 1];
92 b[i] = b[i] - m * c[i - 1];
93 r[i] = r[i] - m * r[i - 1];
96 p1[n - 1] = r[n - 1] / b[n - 1];
97 for (
int i = n - 2; i >= 0; i--)
99 p1[i] = (r[i] - c[i] * p1[i + 1]) / b[i];
103 for (
int i = 0; i < n - 1; i++)
105 p2[i] = 2 * K[i + 1] - p1[i + 1];
108 p2[n - 1] = 0.5 * (K[n] + p1[n - 1]);