public Canvas Render(World world)
        {
            var image = new Canvas(HSize, VSize);

            for (var y = 0; y < VSize; y++)
            {
                for (var x = 0; x < HSize; x++)
                {
                    var ray    = RayForPixel(x, y);
                    var colour = world.ColourAt(ray);
                    image.SetPixel(x, y, colour);
                }
            }

            return(image);
        }
        public Canvas RenderP(World world)
        {
            var image = new Canvas(HSize, VSize);

            var pixelStorage = new ConcurrentBag <RayPixelResult>();

            for (var y = 0; y < VSize; y++)
            {
                var xEnum = Enumerable.Range(0, HSize).ToList();

                Parallel.ForEach(xEnum, (x) =>
                {
                    var ray    = RayForPixel(x, y);
                    var colour = world.ColourAt(ray);
                    pixelStorage.Add(new RayPixelResult(x, y, colour));
                });
            }

            foreach (var pixel in pixelStorage)
            {
                image.SetPixel(pixel.X, pixel.Y, pixel.C);
            }
            return(image);
        }