public void RefractedColorWithRefractedRay()
        {
            var w = World.Default();
            var a = w.Objects[0];

            a.Material.Ambient = 1;
            a.Material.Pattern = new pattern.TestPattern();

            var b = w.Objects[1];

            b.Material.Transparency    = 1;
            b.Material.RefractiveIndex = 1.5;

            var r  = new Ray(pt.Point(0, 0, 0.1), pt.Vector(0, 1, 0));
            var xs = Intersection.Intersections(
                new Intersection(-0.9899, a),
                new Intersection(-0.4899, b),
                new Intersection(0.4899, b),
                new Intersection(0.9899, a)
                );

            var comps = Computation.PrepareComputations(xs[2], r, xs);

            var c   = w.RefractedColor(comps, 5);
            var exp = new c(0, 0.99888, 0.04725);

            CustomAssert.Equal(exp, c, 5);
        }
        public void ReflectedColorForReflectiveMaterial()
        {
            var w     = World.Default();
            var shape = new shape.Plane()
            {
                Material = new Material()
                {
                    Reflective = 0.5
                },
                Transform = transform.Translation(0, -1, 0)
            };

            w.Objects.Add(shape);

            var r = new Ray(
                pt.Point(0, 0, -3),
                pt.Vector(0, -Math.Sqrt(2) / 2, Math.Sqrt(2) / 2));

            var i     = new Intersection(Math.Sqrt(2), shape);
            var comps = Computation.PrepareComputations(i, r);

            var color = w.ReflectedColor(comps);
            //TODO var exp = new c(0.19032, 0.23790, 0.14274);
            var exp = new c(0.19035, 0.23793, 0.14276);

            CustomAssert.Equal(exp, color, 5);
        }
        public void ShadeHitReflectiveMaterial()
        {
            var w     = World.Default();
            var shape = new shape.Plane()
            {
                Material = new Material()
                {
                    Reflective = 0.5
                },
                Transform = transform.Translation(0, -1, 0)
            };

            w.Objects.Add(shape);

            var r = new Ray(
                pt.Point(0, 0, -3),
                pt.Vector(0, -Math.Sqrt(2) / 2, Math.Sqrt(2) / 2));

            var i     = new Intersection(Math.Sqrt(2), shape);
            var comps = Computation.PrepareComputations(i, r);

            var color = w.ShadeHit(comps);
            //TODO var exp = new c(0.87677, 0.92436, 0.82918);
            var exp = new c(0.87677, 0.92436, 0.82919);

            CustomAssert.Equal(exp, color, 5);
        }
Ejemplo n.º 4
0
        public RTF.Canvas DrawRedCircle(RTF.Shapes.Sphere s)
        {
            var    rayOrigin   = RTF.PointType.Point(0, 0, -5);
            double wallZ       = 10;
            double wallSize    = 7;
            var    canvasPixel = 100;
            double pixelSize   = (double)wallSize / (double)canvasPixel;
            double half        = wallSize / 2;

            var canvas = new RTF.Canvas(canvasPixel, canvasPixel, new RTF.Color(0, 0, 0));
            var color  = new RTF.Color(255, 0, 0);
            var shape  = s;

            for (int y = 0; y < canvasPixel; y++)
            {
                var worldY = half - pixelSize * y;
                for (int x = 0; x < canvasPixel; x++)
                {
                    var worldX   = -half + pixelSize * x;
                    var position = RTF.PointType.Point(worldX, worldY, wallZ);

                    var r  = new RTF.Ray(rayOrigin, (position - rayOrigin).Normalize());
                    var xs = shape.Intersect(r);

                    var hit = RTF.Intersection.Hit(xs);

                    if (hit != null)
                    {
                        canvas.WritePixel(x, y, color);
                    }
                }
            }

            return(canvas);
        }
Ejemplo n.º 5
0
        public void ShadeHitIsGivenIntersectionInShadow()
        {
            var w = new RTF.World
            {
                Lights = new List <RTF.Light>()
                {
                    new RTF.Light(p.Point(0, 0, -10), RTF.Color.White)
                }
            };

            var s1 = new Sphere();

            w.Objects.Add(s1);

            var s2 = new Sphere(t.Translation(0, 0, 10));

            w.Objects.Add(s2);

            var r = new RTF.Ray(p.Point(0, 0, 5), p.Vector(0, 0, 1));
            var i = new RTF.Intersection(4, s2);

            var comps = RTF.Computation.PrepareComputations(i, r);
            var c     = w.ShadeHit(comps);

            var expected = new RTF.Color(0.1, 0.1, 0.1);

            Assert.Equal(expected, c);
        }
Ejemplo n.º 6
0
        public void CreateColor()
        {
            var c = new RTF.Color(-0.5, 0.4, 1.7);

            Assert.Equal(-0.5, c.R, 5);
            Assert.Equal(0.4, c.G, 5);
            Assert.Equal(1.7, c.B, 5);
        }
Ejemplo n.º 7
0
        public void StripesWithObjectTransformation()
        {
            var obj     = new shapes.Sphere(tf.Scaling(2, 2, 2));
            var pattern = Pattern.GetStripePattern(RTF.Color.White, RTF.Color.Black);

            RTF.Color c = pattern.AtObject(obj, pt.Point(1.5, 0, 0));
            Assert.Equal(RTF.Color.White, c);
        }
Ejemplo n.º 8
0
        public void MultiplyingScalarColor()
        {
            var c1     = new RTF.Color(0.2, 0.3, 0.4);
            var result = c1 * 2;

            Assert.Equal(0.4, result.R, 5);
            Assert.Equal(0.6, result.G, 5);
            Assert.Equal(0.8, result.B, 5);
        }
Ejemplo n.º 9
0
        public void WritingPixelToCanvas()
        {
            var c   = new RTF.Canvas(10, 20);
            var red = new RTF.Color(1, 0, 0);

            c.WritePixel(2, 3, red);

            Assert.Equal(red, c.PixelAt(2, 3));
        }
Ejemplo n.º 10
0
        public void PointLightHasPositionAndIntensity()
        {
            var intensity = new RTF.Color(1, 1, 1);
            var position  = pt.Point(0, 0, 0);
            var light     = new RTF.Light(position, intensity);

            Assert.Equal(position, light.Position);
            Assert.Equal(intensity, light.Intensity);
        }
Ejemplo n.º 11
0
        public void SubstractionColor()
        {
            var c1     = new RTF.Color(0.9, 0.6, 0.75);
            var c2     = new RTF.Color(0.7, 0.1, 0.25);
            var result = c1 - c2;

            Assert.Equal(0.2, result.R, 5);
            Assert.Equal(0.5, result.G, 5);
            Assert.Equal(0.5, result.B, 5);
        }
Ejemplo n.º 12
0
        public void AddingColor()
        {
            var c1     = new RTF.Color(0.9, 0.6, 0.75);
            var c2     = new RTF.Color(0.7, 0.1, 0.25);
            var result = c1 + c2;

            Assert.Equal(1.6, result.R, 5);
            Assert.Equal(0.7, result.G, 5);
            Assert.Equal(1, result.B, 5);
        }
Ejemplo n.º 13
0
        public void MultiplyingColor()
        {
            var c1     = new RTF.Color(1, 0.2, 0.4);
            var c2     = new RTF.Color(0.9, 1, 0.1);
            var result = c1 * c2;

            Assert.Equal(0.9, result.R, 5);
            Assert.Equal(0.2, result.G, 5);
            Assert.Equal(0.04, result.B, 5);
        }
Ejemplo n.º 14
0
 public static void Equal(RayTracerChallenge.Features.Color expected, RayTracerChallenge.Features.Color actual, int precision)
 {
     if (!expected.Equals(actual, precision))
     {
         throw new EqualException(
                   string.Format(CultureInfo.CurrentCulture, "Expected : {0}", expected.ToString("F" + precision)),
                   string.Format(CultureInfo.CurrentCulture, "Actual : {0}", actual.ToString("F" + precision))
                   );
     }
 }
Ejemplo n.º 15
0
        public void ColorRayHits()
        {
            var w = RTF.World.Default();
            var r = new RTF.Ray(
                RTF.PointType.Point(0, 0, -5),
                RTF.PointType.Vector(0, 0, 1));
            var c   = w.ColorAt(r);
            var exp = new RTF.Color(0.38066, 0.47583, 0.2855);

            CustomAssert.Equal(exp, c, 5);
        }
Ejemplo n.º 16
0
        public void LightingSurfaceShadow()
        {
            var m        = new RTF.Material();
            var position = p.Point(0, 0, 0);

            var eyeV     = p.Vector(0, 0, -1);
            var normalV  = p.Vector(0, 0, -1);
            var light    = new RTF.Light(p.Point(0, 0, -10), RTF.Color.White);
            var inShadow = true;


            var result   = light.Lighting(m, new Sphere(), position, eyeV, normalV, inShadow);
            var expected = new RTF.Color(0.1, 0.1, 0.1);

            Assert.Equal(expected, result);
        }
Ejemplo n.º 17
0
        public void ShadingIntersection()
        {
            var w = RTF.World.Default();
            var r = new RTF.Ray(
                RTF.PointType.Point(0, 0, -5),
                RTF.PointType.Vector(0, 0, 1));
            var shape = w.Objects[0];
            var i     = new RTF.Intersection(4, shape);

            var comps = RTF.Computation.PrepareComputations(i, r);
            var c     = w.ShadeHit(comps);
            var exp   = new RTF.Color(0.38066, 0.47583, 0.2855);

            //var exp = new RTF.Color(0.50066, 0.57583, 0.42550);

            CustomAssert.Equal(exp, c, 5);
        }
Ejemplo n.º 18
0
        public RTF.Canvas ConvertPointsToCanvas(List <RTF.PointType> points, int width, int height)
        {
            RTF.Canvas c      = new RTF.Canvas(width, height, new RTF.Color(0, 0, 0));
            var        radius = (3d / 8d) * width;

            var color = new RTF.Color(255, 255, 255);

            foreach (var point in points)
            {
                int x = (int)((radius * point.X) + width / 2);
                int y = (int)((radius * point.Z) + height / 2);

                c.WritePixel(x, y, color);
            }

            return(c);
        }
Ejemplo n.º 19
0
        public void RenderingWorldWithCamera()
        {
            var w = RTF.World.Default();
            var c = new RTF.Camera(11, 11, Math.PI / 2);

            var from = RTF.PointType.Point(0, 0, -5);
            var to   = RTF.PointType.Point(0, 0, 0);
            var up   = RTF.PointType.Vector(0, 1, 0);

            c.Transform = RTH.Transformations.ViewTransform(from, to, up);

            RTF.Canvas image = RTF.Canvas.Render(c, w);

            var exp = new RTF.Color(0.38066, 0.47583, 0.2855);

            CustomAssert.Equal(exp, image.PixelAt(5, 5), 5);
        }
Ejemplo n.º 20
0
        public void ConstructPPMPixelData()
        {
            var expected = "255 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
                           "0 0 0 0 0 0 0 128 0 0 0 0 0 0 0\n" +
                           "0 0 0 0 0 0 0 0 0 0 0 0 0 0 255";

            var c  = new RTF.Canvas(5, 3);
            var c1 = new RTF.Color(1.5, 0, 0);
            var c2 = new RTF.Color(0, 0.5, 0);
            var c3 = new RTF.Color(-0.5, 0, 1);

            c.WritePixel(0, 0, c1);
            c.WritePixel(2, 1, c2);
            c.WritePixel(4, 2, c3);

            Assert.Equal(expected, string.Join("\n", c.CreatePPMCanvas()));
        }
        public void ShadeHitReflectiveTransparentMaterial()
        {
            var w     = World.Default();
            var floor = new shape.Plane
            {
                Transform = transform.Translation(0, -1, 0),
                Material  = new Material()
                {
                    Reflective      = 0.5,
                    Transparency    = 0.5,
                    RefractiveIndex = 1.5
                }
            };

            w.Objects.Add(floor);

            var ball = new shape.Sphere
            {
                Transform = transform.Translation(0, -3.5, -0.5),
                Material  = new Material()
                {
                    Color   = c.Red,
                    Ambient = 0.5
                }
            };

            w.Objects.Add(ball);

            var r = new Ray(
                pt.Point(0, 0, -3),
                pt.Vector(0, -Math.Sqrt(2) / 2, Math.Sqrt(2) / 2));
            var xs = Intersection.Intersections(
                new Intersection(Math.Sqrt(2), floor));
            var comps = Computation.PrepareComputations(xs[0], r, xs);
            var color = w.ShadeHit(comps, 5);
            //TODO var exp = new c(0.93391, 0.69643, 0.69243);
            var exp = new c(0.93392, 0.69644, 0.69243);

            CustomAssert.Equal(exp, color, 5);
        }
Ejemplo n.º 22
0
        public void ShadingIntersectionFromInside()
        {
            var w = RTF.World.Default();

            w.Lights = new System.Collections.Generic.List <RTF.Light>()
            {
                new RTF.Light(
                    RTF.PointType.Point(0, 0.25, 0),
                    RTF.Color.White)
            };
            var r = new RTF.Ray(
                RTF.PointType.Point(0, 0, 0),
                RTF.PointType.Vector(0, 0, 1));
            var shape = w.Objects[1];

            var i     = new RTF.Intersection(0.5, shape);
            var comps = RTF.Computation.PrepareComputations(i, r);
            var c     = w.ShadeHit(comps);
            var exp   = new RTF.Color(0.90498, 0.90498, 0.90498);

            CustomAssert.Equal(exp, c, 5);
        }