public void CheckersShouldRepeatInZ()
        {
            var pattern = new CheckerboardPattern(ColourFactory.White, ColourFactory.Black);

            Assert.AreEqual(ColourFactory.White, pattern.PatternAt(new Point(0, 0, 0)));
            Assert.AreEqual(ColourFactory.White, pattern.PatternAt(new Point(0, 0, 0.99)));
            Assert.AreEqual(ColourFactory.Black, pattern.PatternAt(new Point(0, 0, 1.01)));
        }
        public void RenderScene()
        {
            var world = new World();

            world.LightSource = new Light(new Point(-10, 10, -10), new Colour(1, 1, 1));


            var floorPlane   = new Plane();
            var floorPattern = new CheckerboardPattern(new Colour(0.9, 0.3, 0.3), new Colour(0, 0.8, 0.6));

            //var floorPattern2 = new StripePattern(new Colour(0.9, 0.3, 0.3), new Colour(0, 0.8, 0.6));
            floorPlane.Material.Pattern           = floorPattern;
            floorPlane.Material.Pattern.Transform = Matrix.Translation(0, 0.01, 0);
            world.SceneObjects.Add(floorPlane);

            var middleSphere = new Sphere
            {
                Transform = Matrix.Translation(-0.5, 1, 0.5),
                Material  = new Material
                {
                    Colour   = new Colour(0.1, 1, 0.5),
                    Diffuse  = 0.7,
                    Specular = 0.2,
                    Pattern  = new CheckerboardPattern(new Colour(0.5, 1, 0.5), new Colour(0.5, 0.8, 0.6))
                }
            };

            middleSphere.Material.Pattern.Transform = Matrix.Scaling(0.1, 0.1, 0.1);

            world.SceneObjects.Add(middleSphere);


            var rightSphere = new Sphere
            {
                Transform = Matrix.Translation(1.5, 0.5, -0.5) * Matrix.Scaling(0.5, 0.5, 0.5),
                Material  = new Material
                {
                    Colour   = new Colour(0.5, 1, 0.1),
                    Diffuse  = 0.7,
                    Specular = 0.2,
                    Pattern  = new RingPattern(new Colour(0, 1, 0), new Colour(0, 0, 1))
                }
            };

            world.SceneObjects.Add(rightSphere);

            var leftSphere = new Sphere
            {
                Transform = Matrix.Translation(-1.5, 0.33, -0.75) * Matrix.Scaling(0.33, 0.33, 0.33),
                Material  = new Material
                {
                    Colour   = new Colour(1, 0.8, 0.1),
                    Diffuse  = 0.7,
                    Specular = 0.2,
                    Pattern  = new GradientPattern(new Colour(1, 0.5, 0), new Colour(0, 0.5, 1))
                }
            };

            world.SceneObjects.Add(leftSphere);

            var rightSphere2 = new Sphere
            {
                Transform = Matrix.Translation(1.5, 2.5, -0.5) * Matrix.Scaling(0.4, 0.2, 0.8),
                Material  = new Material
                {
                    Colour   = new Colour(0.6, 0.2, 0.7),
                    Diffuse  = 0.7,
                    Specular = 0.2
                }
            };

            world.SceneObjects.Add(rightSphere2);


            var camera = new Camera(500, 400, Math.PI / 3);

            camera.Transform = Matrix.ViewTransform(new Point(0, 1.5, -6), new Point(0, 1, 0), new Vector(0.3, 1, 0));

            var canvas = camera.Render(world);

            var output = canvas.ToPpm();

            File.WriteAllText("PatternExperiment.ppm", output);
        }