public static void Chapter5Challenge() { //Create an image of a sphere by only testing for hits or misses. RT.Mat4 transMatrix = new RT.Mat4(); RT.Scene scene = new RT.Scene(); //transMatrix = RT.Mat4.ScaleMatrix(1,0.5f,1); //transMatrix = RT.Mat4.ScaleMatrix(0.5f,1,1); //transMatrix = RT.Mat4.RotateMatrix(0.0f, 0.0f, RT.Constants.pi * 0.25f) * RT.Mat4.ScaleMatrix(1,0.5f,1); transMatrix = RT.Mat4.ShearMatrix(1, 0, 0, 0, 0, 0) * RT.Mat4.ScaleMatrix(0.5f, 1, 1); int resolution = 200; RT.Canvas canvas = new RT.Canvas(resolution, resolution); canvas.FillCanvas(RT.Color.black); RT.Sphere sphere = new RT.Sphere(); sphere.SetMatrix(transMatrix); RT.Point camera = new RT.Point(0, 0, -5); //Use the wall x and y as the width and height and the position of the wall as the z value RT.Point wall = new RT.Point(0.0f, 0.0f, 7f); double wallSize = 7.0f; //Camera is the start point, rays are created by taking iterating over the wall in resultion steps //vertically and horizontally, calc wall - camera to get direction of camera to wall location. //Check if the ray hits the sphere, if it does draw red if it does not draw black. for (int y = 0; y < resolution; y++) { for (int x = 0; x < resolution; x++) { //Need to start at half the width over from the walls origin and increment from there double increment = wallSize / resolution; RT.Vector currentWallPixel = wall - new RT.Point((wallSize * 0.5f) - x * increment, (wallSize * 0.5f) - y * increment, wall.z); //This presents a problem when I want to convert a point to a vector... RT.Point point = (currentWallPixel - camera); RT.Vector direction = new RT.Vector(point).Normalize(); RT.Ray ray = new RT.Ray(camera, direction); RT.Intersection hit = RT.Scene.current.Hit(scene.Intersections(ray)); if (hit != null) { canvas.SetPixel(x, y, RT.Color.red); } } } RT.Save.SaveCanvas(canvas, "Chapter5Challenge"); }
public static void TransformChallenge() { //Create canvas of set size and width //Create Transform that first offsets a point by 1/2 canvas size then //rotates the object by 1/12th of 2*pi through 12 iterations //At each location draw to the canvas a circle int circleRadius = 5; RT.Canvas canvas = new RT.Canvas(100, 100); RT.Point currentLocation = new RT.Point(); //Offset 1/3 distance of canvas size; currentLocation = RT.Mat4.TranslateMatrix(canvas.GetWidth() * 0.3f, 0.0f, 0.0f) * currentLocation; //Rotate loop int maxIterations = 12; for (int r = 0; r < maxIterations; r++) { currentLocation = RT.Mat4.RotateZMatrix(2.0f * RT.Constants.pi * (1.0f / maxIterations)) * currentLocation; //Offset current location so that it is centered in the image by 1/2 width and height through translation RT.Point screenSpaceLocation = RT.Mat4.TranslateMatrix(canvas.GetWidth() * 0.5f, canvas.GetHeight() * 0.5f, 0.0f) * currentLocation; Console.WriteLine("Point " + r.ToString()); Console.WriteLine(screenSpaceLocation); //Draw circle at current location canvas.DrawCircle((int)screenSpaceLocation.x, (int)screenSpaceLocation.y, circleRadius, RT.Color.green); } //Save out the image when completed. RT.Save.SaveCanvas(canvas, "TransformChallenge"); }
public Projectile(RT.Point position, RT.Vector velocity) { this.position = position; this.velocity = velocity; }