Beispiel #1
0
        public void CircleBoundaryDistanceToLineTest()
        {
            Point3d  p = new Point3d();
            Circle3d c = new Circle3d(p, 1.0, new Vector3d(0, 0, 1));
            Point3d  point_on_circle, point_on_line;

            // Parallel objects
            Line3d l    = new Line3d(new Point3d(0, 2, 1), new Vector3d(1, 0, 0));
            double dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);

            Assert.AreEqual(dist, Sqrt(2));
            Assert.AreEqual(point_on_circle, new Point3d(0, 1, 0));
            Assert.AreEqual(point_on_line, new Point3d(0, 2, 1));

            l    = new Line3d(new Point3d(0, 1, 1), new Vector3d(1, 0, 0));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.AreEqual(dist, 1);
            Assert.AreEqual(point_on_circle, new Point3d(0, 1, 0));
            Assert.AreEqual(point_on_line, new Point3d(0, 1, 1));

            l    = new Line3d(new Point3d(0, 0, 1), new Vector3d(1, 0, 0));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.AreEqual(dist, 1);
            Assert.AreEqual(point_on_circle, new Point3d(1, 0, 0));
            Assert.AreEqual(point_on_line, new Point3d(1, 0, 1));

            // Coplanar intersecting objects
            l    = new Line3d(new Point3d(0, 1, 0), new Vector3d(1, 0, 0));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.AreEqual(dist, 0);
            Assert.AreEqual(point_on_circle, new Point3d(0, 1, 0));
            Assert.AreEqual(point_on_line, new Point3d(0, 1, 0));


            // Coplanar non-intersecting objects
            l    = new Line3d(new Point3d(0, 2, 0), new Vector3d(1, 0, 0));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.AreEqual(dist, 1);
            Assert.AreEqual(point_on_circle, new Point3d(0, 1, 0));
            Assert.AreEqual(point_on_line, new Point3d(0, 2, 0));


            // Intersecting objects
            l    = new Line3d(new Point3d(1, 0, 0), new Vector3d(1, 0, 1));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, 0));
            Assert.AreEqual(point_on_circle, new Point3d(1, 0, 0));
            Assert.AreEqual(point_on_line, new Point3d(1, 0, 0));


            // Non-intersecting objects
            l    = new Line3d(new Point3d(0, 0, 0), new Vector3d(1, 0, 1));
            dist = c.DistanceToBoundary(l, out point_on_circle, out point_on_line);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, Sqrt(0.5)));
            Assert.AreEqual(point_on_circle, new Point3d(-1, 0, 0));
            Assert.AreEqual(point_on_line, new Point3d(-0.5, 0, -0.5));
        }
Beispiel #2
0
        public void CircleDistanceToCircleTest()
        {
            Circle3d c1 = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            Circle3d c2 = new Circle3d(new Point3d(11, 0, 0), 5, new Vector3d(0, 0, 1));

            Assert.IsTrue(GeometRi3D.AlmostEqual(c1.DistanceTo(c2), 1));

            c2 = new Circle3d(new Point3d(11, 0, 0), 5, new Vector3d(0, 2, 1));
            Assert.IsTrue(GeometRi3D.AlmostEqual(c1.DistanceTo(c2), 1));
        }
        public void AxisToFromMatrixTest()
        {
            Vector3d v     = new Vector3d(4, 111, 6);
            double   angle = 0.0515;

            Rotation r = new Rotation(v, angle);

            Assert.IsTrue(r.ToAxis.IsParallelTo(v));
            Assert.IsTrue(GeometRi3D.AlmostEqual(r.ToAngle, angle));
        }
        public void AxisToFromQuaternionTest()
        {
            Vector3d v     = new Vector3d(4, 111, 6);
            double   angle = 0.0515;

            Quaternion q = new Quaternion(v, angle);

            Assert.IsTrue(q.ToAxis.IsParallelTo(v));
            Assert.IsTrue(GeometRi3D.AlmostEqual(q.ToAngle, angle));
        }
Beispiel #5
0
        public void DistanceToPointTest()
        {
            Box3d   b  = new Box3d();
            Point3d p1 = new Point3d(0.3, 0.4, 0.2); // Point inside box
            Point3d p2 = new Point3d(0.3, 0.4, 0.5); // Point on boundary
            Point3d p3 = new Point3d(0.3, 0.4, 1.0); // Point outside box

            Assert.IsTrue(GeometRi3D.AlmostEqual(b.DistanceTo(p1), 0.0));
            Assert.IsTrue(GeometRi3D.AlmostEqual(b.DistanceTo(p2), 0.0));
            Assert.IsTrue(GeometRi3D.AlmostEqual(b.DistanceTo(p3), 0.5));
        }
Beispiel #6
0
        public void CircleDistanceToPointTest()
        {
            Circle3d c = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            Point3d  p = new Point3d(2, 3, 4);

            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 4));

            p = new Point3d(4, 3, 0);
            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 0));

            p = new Point3d(2, 3, 0);
            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 0));

            p = new Point3d(8, 0, 4);
            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 5));
        }
Beispiel #7
0
        public void CircleDistanceToPlaneTest()
        {
            // Parallel circle
            Plane3d  p = new Plane3d(new Point3d(), new Vector3d(0, 0, 1));
            Circle3d c = new Circle3d(new Point3d(10, 10, 10), 5, new Vector3d(0, 0, 1));

            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 10));

            // Orthogonal circle
            c = new Circle3d(new Point3d(10, 10, 10), 5, new Vector3d(1, 1, 0));
            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 5));

            // Inclined circle
            c = new Circle3d(new Point3d(10, 10, 10), 5, new Vector3d(3, 0, 4));
            Assert.IsTrue(GeometRi3D.AlmostEqual(c.DistanceTo(p), 7));
        }
Beispiel #8
0
        public void CircleToCircleClosestPointTest()
        {
            Point3d p1, p2;

            // Nonintersecting circles in one plane
            Circle3d c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            Circle3d c2   = new Circle3d(new Point3d(11, 0, 0), 5, new Vector3d(0, 0, 1));
            double   dist = c1.DistanceTo(c2, out p1, out p2);

            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Intersecting circles in one plane
            c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            c2   = new Circle3d(new Point3d(8, 0, 0), 5, new Vector3d(0, 0, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Intersecting circles in one plane
            c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            c2   = new Circle3d(new Point3d(0, 0, 0), 3, new Vector3d(0, 0, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Touching circles
            c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            c2   = new Circle3d(new Point3d(8, 0, 0), 3, new Vector3d(0, 0, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Coplanar circles
            c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            c2   = new Circle3d(new Point3d(5, 0, 5), 3, new Vector3d(0, 0, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Coplanar circles
            c1   = new Circle3d(new Point3d(0, 0, 0), 5, new Vector3d(0, 0, 1));
            c2   = new Circle3d(new Point3d(15, 0, 5), 3, new Vector3d(0, 0, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));

            // Random circles
            c1   = new Circle3d(new Point3d(2, 3, 0), 5, new Vector3d(4, -2, 1));
            c2   = new Circle3d(new Point3d(15, 7, 5), 3, new Vector3d(2, 3, 1));
            dist = c1.DistanceTo(c2, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, p1.DistanceTo(p2)));
        }
Beispiel #9
0
        public void CircleDistanceToSphereTest()
        {
            Point3d  p = new Point3d();
            Circle3d c = new Circle3d(p, 1.0, new Vector3d(0, 0, 1));
            Point3d  p1, p2;

            // Intersecting objects
            Sphere s    = new Sphere(new Point3d(0, 0, 1), 1.1);
            double dist = c.DistanceTo(s, out p1, out p2);

            Assert.AreEqual(dist, 0.0);
            Assert.AreEqual(p1, new Point3d(0, 0, 0));
            Assert.AreEqual(p2, new Point3d(0, 0, -0.1));

            s = new Sphere(new Point3d(0, 0, 0), 10);
            Assert.AreEqual(c.DistanceTo(s), 0.0);

            s    = new Sphere(new Point3d(2, 0, 0), 1.1);
            dist = c.DistanceTo(s, out p1, out p2);
            Assert.AreEqual(dist, 0.0);
            Assert.AreEqual(p1, new Point3d(1, 0, 0));
            Assert.AreEqual(p2, new Point3d(0.9, 0, 0));

            // Touching objects
            s    = new Sphere(new Point3d(0, 0, 1), 1.0);
            dist = c.DistanceTo(s, out p1, out p2);
            Assert.AreEqual(dist, 0.0);
            Assert.AreEqual(p1, new Point3d(0, 0, 0));
            Assert.AreEqual(p2, new Point3d(0, 0, 0));

            s    = new Sphere(new Point3d(2, 0, 0), 1.0);
            dist = c.DistanceTo(s, out p1, out p2);
            Assert.AreEqual(dist, 0.0);
            Assert.AreEqual(p1, new Point3d(1, 0, 0));
            Assert.AreEqual(p2, new Point3d(1, 0, 0));

            // Non-intersecting objects
            s    = new Sphere(new Point3d(3, 0, 0), 1.0);
            dist = c.DistanceTo(s, out p1, out p2);
            Assert.IsTrue(GeometRi3D.AlmostEqual(dist, 1.0));
            Assert.AreEqual(p1, new Point3d(1, 0, 0));
            Assert.AreEqual(p2, new Point3d(2, 0, 0));
        }