From 5a860740af315f8ab415b785205d3efad5429b21 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 23 Nov 2013 16:54:01 +0100 Subject: coordinates corrections --- raytracer.hs | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/raytracer.hs b/raytracer.hs index 80fa348..15ebc18 100644 --- a/raytracer.hs +++ b/raytracer.hs @@ -13,24 +13,25 @@ type Sphere = (Coord, Double) degrees = pi / 180 -eye = (100, 100, 2) +eye = (0, 0, 2) x_of (x, _, _) = x y_of (_, y, _) = y z_of (_, _, z) = z -sphere1 = ((10, 85, 0), 4) -sphere2 = ((-10, 45, 0), 4) +sphere1 = ((40, 85, 0), 4) +sphere2 = ((40, 45, 0), 4) -alpha1 = 80 * degrees -alpha2 = -40 * degrees -beta1 = 25 * degrees +alpha1 = 180 * degrees +alpha2 = 0 * degrees + +beta1 = 20 * degrees beta2 = -20 * degrees floorscale = 1 -w = 800 +w = 600 h = 400 oversampling = 1 -- each pixel is 2x2 rays @@ -66,11 +67,19 @@ discr source (alpha, beta) (centre, radius) = 4*(( aa * u + bb * v + cc * w )^2 bb = sin alpha cc = sin beta -intersect_sphere :: Coord -> ScreenCoord -> Sphere -> Bool +intersect_sphere :: Coord -> ScreenCoord -> Sphere -> Double intersect_sphere source (alpha, beta) (centre, radius) - | discr source (alpha, beta) (centre, radius) > 0 = True - | otherwise = False - + | delta > 0 = min ((-b - sqrt(delta)) / (2*a)) ((-b + sqrt(delta)) / (2*a)) + | otherwise = 0 + where delta = discr source (alpha, beta) (centre, radius) + a = aa^2 + bb^2 + cc^2 + b = 2 * (aa*u + bb*v + cc*w) + u = (x_of source) - (x_of centre) + v = (y_of source) - (y_of centre) + w = (z_of source) - (z_of centre) + aa = cos alpha + cos beta + bb = sin alpha + cc = sin beta @@ -84,7 +93,7 @@ intersect_floor source (alpha, beta) floorcolor :: Coord -> ScreenCoord -> Color floorcolor source (alpha, beta) - | x > 0.5 && x < 0.5 = (0, attn, attn) + | x > (-0.5) && x < 0.5 = (0, attn, attn) | y > (-0.5) && y < 0.5 = (attn, attn, 0) | (round (x/floorscale) `mod` 2) == (round (y/floorscale) `mod` 2) = (attn, 0, 0) | otherwise = (attn, attn, attn) @@ -99,8 +108,8 @@ skycolor source (alpha, beta) = (60, pixel_color :: Coord -> ScreenCoord -> Color pixel_color source (alpha, beta) - | intersect_sphere source (alpha, beta) sphere1 = (200, 0, 0) - | intersect_sphere source (alpha, beta) sphere2 = (0, 200, 0) + | intersect_sphere source (alpha, beta) sphere1 > 0 = (200, 0, 0) + | intersect_sphere source (alpha, beta) sphere2 > 0 = (0, 200, 0) | beta > 0 = skycolor source (alpha, beta) | beta == 0 = (0, 255, 0) | otherwise = floorcolor source (alpha, beta) -- cgit v1.2.3