補間補間
3次スプライン補間 単体テスト; Cubic Spline Unit Test

概要
3次スプライン補間の単体テスト
テスト対象の3次スプライン補間基本クラスはこちら

スプライン補間構成
スプライン基本クラス

  ・3次スプライン基本クラス

    ・制御点とその近傍2点から傾きを算出する3次スプライン基本クラス

      ・単調スプライン

      ・Catmull-Romスプライン

    ・制御点とその近傍4点から傾きを算出する3次スプライン基本クラス

      ・秋間スプライン

終端タイプ列挙型

多次元スプライン補間ジェネリッククラス

3次スプライン基本クラス 単体テスト

namespace SplineInterpolation.Tests {
    [TestClass()]
    public class CubicSplineTests {
        double[] v1 = { 12, 15, 15, 10,  10, 10, 10.5, 15, 50, 60, 85 };

        [TestMethod()]
        public void InitializeTest() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

            sp2.Set(v1);
            sp2.Initialize();

            Assert.AreEqual(sp1, sp2);

            sp1.Set(v1);
            sp2.Set(v1);

            Assert.AreEqual(sp1, sp2);
        }

        [TestMethod()]
        public void EqualTest() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Open);
            AkimaSpline sp2 = new AkimaSpline(EndType.Close);
            AkimaSpline sp3 = new AkimaSpline(EndType.Open);
            AkimaSpline sp4 = new AkimaSpline(EndType.Open);
            AkimaSpline sp5 = new AkimaSpline(EndType.Open);
            AkimaSpline sp6 = new AkimaSpline(EndType.Open);

            sp1.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60, 85);
            sp2.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60, 85);
            sp3.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60, 86);
            sp4.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60);
            sp5.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60, 85, 90);
            sp6.Set(12, 15, 15, 10, 10, 10, 10.5, 15, 50, 60, 85);

            Assert.AreEqual(sp1 != sp2, true);
            Assert.AreEqual(sp1 != sp3, true);
            Assert.AreEqual(sp1 != sp4, true);
            Assert.AreEqual(sp1 != sp5, true);
            Assert.AreEqual(sp1 == sp6, true);
        }
    }
}

制御点とその近傍2点から傾きを算出する3次スプライン基本クラス 単体テスト

namespace SplineInterpolation.Tests {
    [TestClass()]
    public class CubicSplineNeighbor2Tests {
        double[] v1 = { 12, 15, 15, 10,  10, 10, 10.5, 15, 50, 60, 85 };

        [TestMethod()]
        public void InsertTest1() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp3 = new CatmullRomSpline(EndType.Open);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1, i + 1);
                sp2.Insert(i, v1[i]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest2() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp3 = new CatmullRomSpline(EndType.Open);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1.Skip(v1.Length - i - 1).ToArray(), i + 1);
                sp2.Insert(0, v1[v1.Length - i - 1]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest3() {
            for(int test = 0; test < 100; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);

                List<double> v2 = new List<double>();
                Random random = new Random(test);

                for(int i = 0; i < 100; i++) {
                    int index = random.Next(i + 1);
                    double new_v = random.NextDouble();

                    v2.Insert(index, new_v);

                    sp1.Set(v2.ToArray());
                    sp2.Insert(index, new_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void InsertTest4() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp3 = new CatmullRomSpline(EndType.Close);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1, i + 1);
                sp2.Insert(i, v1[i]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest5() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp3 = new CatmullRomSpline(EndType.Close);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1.Skip(v1.Length - i - 1).ToArray(), i + 1);
                sp2.Insert(0, v1[v1.Length - i - 1]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest6() {
            for(int test = 0; test < 100; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

                List<double> v2 = new List<double>();
                Random random = new Random(test);

                for(int i = 0; i < 100; i++) {
                    int index = random.Next(i + 1);
                    double new_v = random.NextDouble();

                    v2.Insert(index, new_v);

                    sp1.Set(v2.ToArray());
                    sp2.Insert(index, new_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void RemoveTest1() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(0);

                sp1.Set(v3.ToArray());
                sp2.Remove(0);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest2() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(v3.Count - 1);

                sp1.Set(v3.ToArray());
                sp2.Remove(sp2.Points - 1);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest3() {
            for(int test = 0; test < 100; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);

                Random random = new Random(test);
                List<double> v3 = (new double[100]).Select((_) => random.NextDouble()).ToList();

                sp2.Set(v3.ToArray());

                while(v3.Count > 0) {
                    int index = random.Next(v3.Count);
                    v3.RemoveAt(index);

                    sp1.Set(v3.ToArray());
                    sp2.Remove(index);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void RemoveTest4() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(0);

                sp1.Set(v3.ToArray());
                sp2.Remove(0);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest5() {
            CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
            CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(v3.Count - 1);

                sp1.Set(v3.ToArray());
                sp2.Remove(sp2.Points - 1);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest6() {
            for(int test = 0; test < 100; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

                Random random = new Random(test);
                List<double> v3 = (new double[100]).Select((_) => random.NextDouble()).ToList();

                sp2.Set(v3.ToArray());

                while(v3.Count > 0) {
                    int index = random.Next(v3.Count);
                    v3.RemoveAt(index);

                    sp1.Set(v3.ToArray());
                    sp2.Remove(index);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void SetPointTest1() {
            for(int test = 0; test < 10; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Open);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Open);

                Random random = new Random(test);
                double[] v2 = (double[])v1.Clone();

                sp2.Set(v2);

                for(int i = 0; i < v1.Length; i++) {
                    double set_v = random.NextDouble();

                    v2[i] = set_v;

                    sp1.Set(v2);
                    sp2.SetPoint(i, set_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void SetPointTest2() {
            for(int test = 0; test < 10; test++) {
                CatmullRomSpline sp1 = new CatmullRomSpline(EndType.Close);
                CatmullRomSpline sp2 = new CatmullRomSpline(EndType.Close);

                Random random = new Random(test);
                double[] v2 = (double[])v1.Clone();

                sp2.Set(v2);

                for(int i = 0; i < v1.Length; i++) {
                    double set_v = random.NextDouble();

                    v2[i] = set_v;

                    sp1.Set(v2);
                    sp2.SetPoint(i, set_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }
    }
}

制御点とその近傍4点から傾きを算出する3次スプライン基本クラス 単体テスト

namespace SplineInterpolation.Tests {
    [TestClass()]
    public class CubicSplineNeighbor4Tests {
        double[] v1 = { 12, 15, 15, 10,  10, 10, 10.5, 15, 50, 60, 85 };

        [TestMethod()]
        public void InsertTest1() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Open);
            AkimaSpline sp2 = new AkimaSpline(EndType.Open);
            AkimaSpline sp3 = new AkimaSpline(EndType.Open);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1, i + 1);
                sp2.Insert(i, v1[i]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest2() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Open);
            AkimaSpline sp2 = new AkimaSpline(EndType.Open);
            AkimaSpline sp3 = new AkimaSpline(EndType.Open);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1.Skip(v1.Length - i - 1).ToArray(), i + 1);
                sp2.Insert(0, v1[v1.Length - i - 1]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest3() {
            for(int test = 0; test < 100; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Open);
                AkimaSpline sp2 = new AkimaSpline(EndType.Open);

                List<double> v2 = new List<double>();
                Random random = new Random(test);

                for(int i = 0; i < 100; i++) {
                    int index = random.Next(i + 1);
                    double new_v = random.NextDouble();

                    v2.Insert(index, new_v);

                    sp1.Set(v2.ToArray());
                    sp2.Insert(index, new_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void InsertTest4() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Close);
            AkimaSpline sp2 = new AkimaSpline(EndType.Close);
            AkimaSpline sp3 = new AkimaSpline(EndType.Close);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1, i + 1);
                sp2.Insert(i, v1[i]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest5() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Close);
            AkimaSpline sp2 = new AkimaSpline(EndType.Close);
            AkimaSpline sp3 = new AkimaSpline(EndType.Close);

            for(int i = 0; i < v1.Length; i++) {
                sp1.Set(v1.Skip(v1.Length - i - 1).ToArray(), i + 1);
                sp2.Insert(0, v1[v1.Length - i - 1]);

                Assert.AreEqual(sp1, sp2);
            }

            sp3.Set(v1);

            Assert.AreEqual(sp1, sp3);
            Assert.AreEqual(sp2, sp3);
        }

        [TestMethod()]
        public void InsertTest6() {
            for(int test = 0; test < 100; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Close);
                AkimaSpline sp2 = new AkimaSpline(EndType.Close);

                List<double> v2 = new List<double>();
                Random random = new Random(test);

                for(int i = 0; i < 100; i++) {
                    int index = random.Next(i + 1);
                    double new_v = random.NextDouble();

                    v2.Insert(index, new_v);

                    sp1.Set(v2.ToArray());
                    sp2.Insert(index, new_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void RemoveTest1() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Open);
            AkimaSpline sp2 = new AkimaSpline(EndType.Open);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(0);

                sp1.Set(v3.ToArray());
                sp2.Remove(0);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest2() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Open);
            AkimaSpline sp2 = new AkimaSpline(EndType.Open);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(v3.Count - 1);

                sp1.Set(v3.ToArray());
                sp2.Remove(sp2.Points - 1);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest3() {
            for(int test = 0; test < 100; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Open);
                AkimaSpline sp2 = new AkimaSpline(EndType.Open);

                Random random = new Random(test);
                List<double> v3 = (new double[100]).Select((_) => random.NextDouble()).ToList();

                sp2.Set(v3.ToArray());

                while(v3.Count > 0) {
                    int index = random.Next(v3.Count);
                    v3.RemoveAt(index);

                    sp1.Set(v3.ToArray());
                    sp2.Remove(index);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void RemoveTest4() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Close);
            AkimaSpline sp2 = new AkimaSpline(EndType.Close);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(0);

                sp1.Set(v3.ToArray());
                sp2.Remove(0);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest5() {
            AkimaSpline sp1 = new AkimaSpline(EndType.Close);
            AkimaSpline sp2 = new AkimaSpline(EndType.Close);

            List<double> v3 = v1.ToList();

            sp2.Set(v3.ToArray());

            while(v3.Count > 0) {
                v3.RemoveAt(v3.Count - 1);

                sp1.Set(v3.ToArray());
                sp2.Remove(sp2.Points - 1);

                Assert.AreEqual(sp1, sp2);
            }
        }

        [TestMethod()]
        public void RemoveTest6() {
            for(int test = 0; test < 100; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Close);
                AkimaSpline sp2 = new AkimaSpline(EndType.Close);

                Random random = new Random(test);
                List<double> v3 = (new double[100]).Select((_) => random.NextDouble()).ToList();

                sp2.Set(v3.ToArray());

                while(v3.Count > 0) {
                    int index = random.Next(v3.Count);
                    v3.RemoveAt(index);

                    sp1.Set(v3.ToArray());
                    sp2.Remove(index);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void SetPointTest1() {
            for(int test = 0; test < 10; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Open);
                AkimaSpline sp2 = new AkimaSpline(EndType.Open);

                Random random = new Random(test);
                double[] v2 = (double[])v1.Clone();

                sp2.Set(v2);

                for(int i = 0; i < v1.Length; i++) {
                    double set_v = random.NextDouble();

                    v2[i] = set_v;

                    sp1.Set(v2);
                    sp2.SetPoint(i, set_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }

        [TestMethod()]
        public void SetPointTest2() {
            for(int test = 0; test < 10; test++) {
                AkimaSpline sp1 = new AkimaSpline(EndType.Close);
                AkimaSpline sp2 = new AkimaSpline(EndType.Close);

                Random random = new Random(test);
                double[] v2 = (double[])v1.Clone();

                sp2.Set(v2);

                for(int i = 0; i < v1.Length; i++) {
                    double set_v = random.NextDouble();

                    v2[i] = set_v;

                    sp1.Set(v2);
                    sp2.SetPoint(i, set_v);

                    Assert.AreEqual(sp1, sp2);
                }
            }
        }
    }
}

関連項目
3次スプライン補間基本クラス
秋間スプライン
単調スプライン
Catmull-Romスプライン

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類