public Cubic1D(float2[] data) { // Sort points to go strictly from left to right. List<float2> DataList = data.ToList(); DataList.Sort((p1, p2) => p1.X.CompareTo(p2.X)); data = DataList.ToArray(); Data = data; Breaks = data.Select(i => i.X).ToArray(); Coefficients = new float4[data.Length - 1]; float[] h = MathHelper.Diff(data.Select(i => i.X).ToArray()); float[] del = MathHelper.Div(MathHelper.Diff(data.Select(i => i.Y).ToArray()), h); float[] slopes = GetPCHIPSlopes(data, del); float[] dzzdx = new float[del.Length]; for (int i = 0; i < dzzdx.Length; i++) dzzdx[i] = (del[i] - slopes[i]) / h[i]; float[] dzdxdx = new float[del.Length]; for (int i = 0; i < dzdxdx.Length; i++) dzdxdx[i] = (slopes[i + 1] - del[i]) / h[i]; for (int i = 0; i < Coefficients.Length; i++) Coefficients[i] = new float4((dzdxdx[i] - dzzdx[i]) / h[i], 2f * dzzdx[i] - dzdxdx[i], slopes[i], data[i].Y); }