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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }
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); }
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); }
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)) ); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }