幾何学幾何学
空間上の交差単体テスト; 3D Intersect Unit Test

概要
空間上の交差の単体テスト
テスト対象の空間上の交差クラスはこちら


ソースコード

namespace Geometry.Geometry3D.Tests {
    [TestClass()]
    public class Intersect3DTests {
        [TestMethod()]
        public void LineLineTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Scale(1, 2, 3) * Matrix3D.Move(-5, -6, -7);

            Line3D line1 = new Line3D(new Vector3D(1, 3, 1), new Vector3D(3, 2, 0));
            Line3D line2 = new Line3D(new Vector3D(6, 1, 1), new Vector3D(-1, 2, 0));

            Vector3D cross = Intersect3D.LineLine(matrix * line1, matrix * line2, 1e-12);

            Assert.AreEqual((cross - matrix * new Vector3D(4, 5, 1)).Norm < 1e-12, true);
        }

        [TestMethod()]
        public void LinePlaneTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Scale(1, 2, 3) * Matrix3D.Move(-5, -6, -7);

            Vector3D v1 = new Vector3D(1, 0, 0), v2 = new Vector3D(0, 2, 0), v3 = new Vector3D(0, 0, 3);

            Plane3D plane = new Plane3D(matrix * v1, matrix * v2, matrix * v3);

            Vector3D cross1 = Intersect3D.LinePlane(matrix * new Line3D(Vector3D.Zero, v1), plane);

            Assert.AreEqual((cross1 - matrix * v1).Norm < 1e-12, true);

            Vector3D cross2 = Intersect3D.LinePlane(matrix * new Line3D(Vector3D.Zero, -v1), plane);

            Assert.AreEqual((cross2 - matrix * v1).Norm < 1e-12, true);
        }

        [TestMethod()]
        public void LineTriangleTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Scale(1, 2, 3) * Matrix3D.Move(-5, -6, -7);

            Vector3D v1 = new Vector3D(1, 0, 0), v2 = new Vector3D(0, 1, 0), v3 = new Vector3D(0, 0, 1);

            Vector3D v4 = new Vector3D(1, 1, 1) / 3, v5 = new Vector3D(1, -0.1, -0.1), v6 = new Vector3D(-0.1, 1, -0.1), v7 = new Vector3D(-0.1, -0.1, 1);
            Vector3D v8 = new Vector3D(1, -0.1, 0.1), v9 = new Vector3D(1, 0.1, -0.1), v10 = new Vector3D(-0.1, -1, 0.1), v11 = new Vector3D(-0.1, 0.1, -1);

            Triangle3D triangle = new Triangle3D(matrix * v1, matrix * v2, matrix * v3);

            Vector3D cross1 = Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v4), triangle);

            Assert.AreEqual((cross1 - matrix * v4).Norm < 1e-12, true);

            Vector3D cross2 = Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, -v4), triangle);

            Assert.AreEqual((cross2 - matrix * v4).Norm < 1e-12, true);

            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v5), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v6), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v7), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v8), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v9), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v10), triangle)), false);
            Assert.AreEqual(Vector3D.IsValid(Intersect3D.LineTriangle(matrix * new Line3D(Vector3D.Zero, v11), triangle)), false);
        }

        [TestMethod()]
        public void LineCircleTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Scale(1, 2, 3) * Matrix3D.Move(-5, -6, -7);

            Vector3D v1 = new Vector3D(1, 0, 0), v2 = new Vector3D(0, 1, 0), v3 = new Vector3D(0, 0, 1);
            Vector3D v4 = new Vector3D(1, 2, 3) / 6, v5 = new Vector3D(1, -0.1, -0.1);

            Circle3D circle = Circle3D.Circum(new Triangle3D(matrix * v1, matrix * v2, matrix * v3));

            Vector3D cross1 = Intersect3D.LineCircle(matrix * new Line3D(Vector3D.Zero, v4), circle);

            Assert.AreEqual((cross1 - matrix * v4).Norm < 1e-12, true);

            Vector3D cross2 = Intersect3D.LineCircle(matrix * new Line3D(Vector3D.Zero, -v4), circle);

            Assert.AreEqual((cross2 - matrix * v4).Norm < 1e-12, true);

            Vector3D cross3 = Intersect3D.LineCircle(matrix * new Line3D(Vector3D.Zero, v5), circle);

            Assert.AreEqual(Vector3D.IsValid(cross3), false);
        }

        [TestMethod()]
        public void LineSphereTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Move(-5, -6, -7);

            Vector3D v0 = new Vector3D(3, 4, 0), v1 = new Vector3D(0, 3, -4);

            Line3D line = matrix * new Line3D(v0, v1 - v0);

            Sphere3D sphere = new Sphere3D(matrix * Vector3D.Zero, 5);

            Vector3D[] cross = Intersect3D.LineSphere(line, sphere);

            Assert.AreEqual((cross[0] - matrix * v0).Norm < 1e-12, true);
            Assert.AreEqual((cross[1] - matrix * v1).Norm < 1e-12, true);
        }

        [TestMethod()]
        public void PlanePlaneTest() {
            Vector3D v1 = new Vector3D(-1, 2, 4), v2 = new Vector3D(1, 2, 4), v3 = new Vector3D(1, -2, -1), v4 = new Vector3D(1, 2, 3);

            Plane3D plane_xy = new Plane3D(new Vector3D(0, 0, 1), Vector3D.Zero);
            Plane3D plane_yz = new Plane3D(new Vector3D(1, 0, 0), Vector3D.Zero);
            Plane3D plane_zx = new Plane3D(new Vector3D(0, 1, 0), Vector3D.Zero);

            Plane3D plane1 = new Plane3D(v1, v2, v3);
            Plane3D plane2 = new Plane3D(v1, v2, v4);

            Assert.AreEqual(Intersect3D.PlanePlane(plane_xy, plane_yz).Direction, new Vector3D(0, 1, 0));
            Assert.AreEqual(Intersect3D.PlanePlane(plane_yz, plane_zx).Direction, new Vector3D(0, 0, 1));
            Assert.AreEqual(Intersect3D.PlanePlane(plane_zx, plane_xy).Direction, new Vector3D(1, 0, 0));

            Assert.AreEqual(Intersect3D.PlanePlane(plane1, plane2).V.X, 0);
            Assert.AreEqual(Intersect3D.PlanePlane(plane1, plane2).Direction, new Vector3D(1, 0, 0));
        }

        [TestMethod()]
        public void PlaneSphereTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4) * Matrix3D.Move(-5, -6, -7);

            Vector3D v0 = matrix * Vector3D.Zero, v1 = matrix * new Vector3D(1, 0, 0), v2 = matrix * new Vector3D(0, 1, 0), v3 = matrix * new Vector3D(0, 0, 1);

            Plane3D plane = new Plane3D(v1, v2, v3);
            Circle3D circle = Circle3D.Circum(new Triangle3D(v1, v2, v3));
            Sphere3D sphere = new Sphere3D(v0, 1);

            Circle3D cross = Intersect3D.PlaneSphere(plane, sphere);

            Assert.AreEqual((circle.Center - cross.Center).Norm < 1e-12, true);
            Assert.AreEqual((circle.Normal - cross.Normal).Norm < 1e-12, true);
            Assert.AreEqual(circle.Radius, cross.Radius, 1e-12);
        }

        [TestMethod()]
        public void SphereSphereTest() {
            Matrix3D matrix = Matrix3D.RotateAxis(new Vector3D(1, 2, 3), 4);

            Vector3D v0 = matrix * new Vector3D(-2, 0, 0), v1 = matrix * new Vector3D(3, 0, 0), v2 = matrix * new Vector3D(-0.2, 0, 0);

            Sphere3D sphere1 = new Sphere3D(v0, 3);
            Sphere3D sphere2 = new Sphere3D(v1, 4);
            Circle3D circle = new Circle3D(v2, matrix * new Vector3D(1, 0, 0), 2.4);

            Circle3D cross = Intersect3D.SphereSphere(sphere1, sphere2);

            Assert.AreEqual((circle.Center - cross.Center).Norm < 1e-12, true);
            Assert.AreEqual((circle.Normal - cross.Normal).Norm < 1e-12, true);
            Assert.AreEqual(circle.Radius, cross.Radius, 1e-12);
        }
    }
}

関連項目
空間上の交差

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