コード例 #1
0
ファイル: Single.cs プロジェクト: imintsystems/Kean
        Element[] Natural(Tuple<float, float>[] measures)
        {
            // Compute natural piecewise cubic splines.
            Element[] result = new Element[measures.Length - 1];
            Matrix.Single left = new Matrix.Single(measures.Length, measures.Length);
            Matrix.Single right = new Matrix.Single(1, measures.Length);
            left[0, 0] = 2;
            left[1, 0] = 1;
            left[measures.Length - 1, measures.Length - 1] = 2;
            left[measures.Length - 2, measures.Length - 1] = 1;
            for (int y = 1; y < measures.Length - 1; y++)
            {
                int x = y - 1;
                left[x, y] = 1;
                left[x + 1, y] = 4;
                left[x + 2, y] = 1;
            }
            right[0, 0] = 3 * (measures[1].Item2 - measures[0].Item2);
            right[0, measures.Length - 1] = 3 * (measures[measures.Length - 1].Item2 - measures[measures.Length - 2].Item2);
            for (int y = 1; y < measures.Length - 1; y++)
                right[0, y] = 3 * (measures[y + 1].Item2 - measures[y - 1].Item2);
            Matrix.Single solution = left.Solve(right);

            for (int x = 0; x < measures.Length - 1; x++)
            {
                float a = measures[x].Item2;
                float b = solution[0, x];
                float c = 3 * (measures[x + 1].Item2 - measures[x].Item2) - 2 * solution[0, x] - solution[0, x + 1];
                float d = 2 * (measures[x].Item2 - measures[x + 1].Item2) + solution[0, x] + solution[0, x + 1];
                result[x] = new Element(a, b, c, d, measures[x].Item1, measures[x + 1].Item1);
            }
            return result;
        }