Exemplo n.º 1
0
        public void CanFailToIntersectWhenRayParallelToPlane()
        {
            // Arrange
            var plane = new Plane() { Point = new Vector(0, 0, 0), Norm = new Vector(0, 1, 0) };
            var ray = new Ray() { Start = new Vector(0, 1, 0), Direction = new Vector(1, 0, 0) };

            // Act
            var isect = plane.Intersect(ray);

            // Assert
            Assert.IsNull(isect);
        }
Exemplo n.º 2
0
        public void CanFailToInsersectWithRayFacingAwayFromSphere()
        {
            // Arrange
            var sphere = new Sphere() { Center = new Vector(0, 0, 0), Radius = 1 };
            var ray = new Ray() { Start = new Vector(0, 0, -2), Direction = new Vector(0, 0, -1) };

            // Act
            var isect = sphere.Intersect(ray);

            // Assert
            Assert.IsNull(isect);
        }
Exemplo n.º 3
0
        public void CanFailToInsersectParallelLine()
        {
            // Arrange
            var line = new Line() { Point = new Vector(0, 1, 0), Direction = new Vector(1, 0, 0) };
            var ray = new Ray() { Start = new Vector(0, 0, 0), Direction = new Vector(1, 0, 0) };

            // Act
            var isect = line.Intersect(ray);

            // Assert
            Assert.IsNull(isect);
        }
Exemplo n.º 4
0
        public void CanInsersectPlane()
        {
            // Arrange
            var plane = new Plane() { Point = new Vector(0, 0, 0), Norm = new Vector(0, 1, 0) };
            var ray = new Ray() { Start = new Vector(0, 1, 0), Direction = new Vector(0, -1, 0) };

            // Act
            var isect = plane.Intersect(ray);

            // Assert
            Assert.NotNull(isect);
            Assert.AreEqual(1, isect.Distance);
            Assert.AreEqual(plane, isect.Element);
        }
Exemplo n.º 5
0
        public void CanIntersectEdgeOfSphere()
        {
            // Arrange
            var sphere = new Sphere() { Center = new Vector(0, 0, 0), Radius = 1 };
            var ray = new Ray() { Start = new Vector(1, 0, -2), Direction = new Vector(0, 0, 1) };

            // Act
            var isect = sphere.Intersect(ray);

            // Assert
            Assert.NotNull(isect);
            Assert.AreEqual(2, isect.Distance);
            Assert.AreEqual(sphere, isect.Element);
        }
Exemplo n.º 6
0
        public void CanInsersectLine()
        {
            // Arrange
            var line = new Line() { Point = new Vector(0, 1, 0), Direction = new Vector(1, 0, 0) };
            var ray = new Ray() { Start = new Vector(0, 0, 0), Direction = new Vector(1, 1, 0) };

            // Act
            var isect = line.Intersect(ray);

            // Assert
            Assert.NotNull(isect);
            Assert.AreEqual(Math.Sqrt(2), isect.Distance);
            Assert.AreEqual(line, isect.Element);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Trace a ray through the scene
        /// </summary>
        /// <param name="ray">The ray to test</param>
        /// <param name="scene">The scene description</param>
        /// <param name="depth">The current depth of recursion</param>
        /// <returns>The color of the pixel</returns>
        private Color TraceRay(Ray ray, Scene scene, int depth)
        {
            var intersection = scene.ClosestIntersection(ray);
            if (intersection == null)
            {
                return Color.Background;
            }

            return this.Shade(intersection, scene, depth);
        }
Exemplo n.º 8
0
        public void CanInsersectPolygon_Square_NearTopRight()
        {
            // Arrange
            var points = new List<Vector>() { new Vector(0, 0, 0), new Vector(1, 0, 0), new Vector(1, 1, 0), new Vector(0, 1, 0) };
            var poly = new Polygon(points, new Vector(0, 0, 1));

            var ray = new Ray() { Start = new Vector(0.9, 0.9, 0.5), Direction = new Vector(0, 0, -1) };

            // Act
            var isect = poly.Intersect(ray);

            // Assert
            Assert.NotNull(isect);
            Assert.AreEqual(0.5, isect.Distance);
            Assert.AreEqual(poly, isect.Element);
        }
Exemplo n.º 9
0
        public void CanFindPointOfIntersection()
        {
            // Arrange
            var points = new List<Vector>() { new Vector(0, 0, 0), new Vector(1, 0, 0), new Vector(1, 1, 0), new Vector(0, 1, 0) };
            var poly = new Polygon(points, new Vector(0, 0, 1));

            var ray = new Ray() { Start = new Vector(0.5, 0.5, 0.5), Direction = new Vector(0, 0, -1) };

            // Act
            var isect = poly.GetPointOfIntersectionWithPlane(ray);

            // Assert
            Assert.NotNull(isect);
            Assert.AreEqual(0.5, isect.X);
            Assert.AreEqual(0.5, isect.Y);
        }
Exemplo n.º 10
0
        public void CanFailToIntersectPlaneWithParallelRay()
        {
            // Arrange
            var points = new List<Vector>() { new Vector(0, 0, 0), new Vector(1, 0, 0), new Vector(1, 1, 0), new Vector(0, 1, 0) };
            var poly = new Polygon(points, new Vector(0, 0, 1));

            var ray = new Ray() { Start = new Vector(1, 0, 0.5), Direction = new Vector(1, 0, 0) };

            // Act
            var isect = poly.GetPointOfIntersectionWithPlane(ray);

            // Assert
            Assert.IsNull(isect);
        }
Exemplo n.º 11
0
        public void CanFailToInsersectTheBackFaceOfAPolygon()
        {
            // Arrange
            var points = new List<Vector>() { new Vector(0, 0, 0), new Vector(1, 0, 0), new Vector(1, 1, 0), new Vector(0, 1, 0) };
            var poly = new Polygon(points, new Vector(0, 0, 1));

            var ray = new Ray() { Start = new Vector(0.5, 0.5, -0.5), Direction = new Vector(0, 0, 1) };

            // Act
            var isect = poly.Intersect(ray);

            // Assert
            Assert.IsNull(isect);
        }
Exemplo n.º 12
0
        public void CanFailToInsersectPolygon_Square_NegativeMiss()
        {
            // Arrange
            var points = new List<Vector>() { new Vector(0, 0, 0), new Vector(1, 0, 0), new Vector(1, 1, 0), new Vector(0, 1, 0) };
            var poly = new Polygon(points, new Vector(0, 0, 1));

            var ray = new Ray() { Start = new Vector(-0.5, 0.5, 0.5), Direction = new Vector(0, 0, -1) };

            // Act
            var isect = poly.Intersect(ray);

            // Assert
            Assert.IsNull(isect);
        }