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スプライン