From db54b4c67b6f75a732b44c1080795c69fd4f6c63 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 23 Nov 2013 13:43:10 +0100 Subject: include source into color calc functions --- raytracer.hs | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/raytracer.hs b/raytracer.hs index 57427c2..8b78ae8 100644 --- a/raytracer.hs +++ b/raytracer.hs @@ -8,10 +8,15 @@ import Data.Char type Angle = Double type ScreenCoord = (Angle, Angle) type Color = (Int, Int, Int) +type Coord = (Double, Double, Double) degrees = pi / 180 -eye = [0, 0, 2] +eye = (0, 0, 2) + +x_of (x, _, _) = x +y_of (_, y, _) = y +z_of (_, _, z) = z alpha1 = 80 * degrees alpha2 = -40 * degrees @@ -34,32 +39,32 @@ imgheader = "P3 " ++ (show w) ++ " " ++ (show h) ++ " 255\n" alphas = take (round w) [alpha1,(alpha1 + ((alpha2 - alpha1) / (w-1)))..] betas = take (round h) [beta1,(beta1 + ((beta2 - beta1) / (h-1)))..] --- intersect at (x , y , depth ) -intersect_floor :: ScreenCoord -> (Double, Double, Double) -intersect_floor (alpha, beta) - | beta < 0 = (-2 * (cos alpha) / (sin beta) - 2 * (cos beta) / (sin beta), - -2 * (sin alpha) / (sin beta), - -2 / (sin beta) ) +-- intersect at (x , y , depth ) +intersect_floor :: Coord -> ScreenCoord -> (Double, Double, Double) +intersect_floor source (alpha, beta) + | beta < 0 = (-(z_of source) * (cos alpha) / (sin beta) - 2 * (cos beta) / (sin beta), + -(z_of source) * (sin alpha) / (sin beta), + -(z_of source) / (sin beta) ) | otherwise = (0, 0, 0) -floorcolor :: ScreenCoord -> Color -floorcolor (alpha, beta) +floorcolor :: Coord -> ScreenCoord -> Color +floorcolor source (alpha, beta) | (round (x/8) `mod` 2) == (round (y/8) `mod` 2) = (attn, 0, 0) | otherwise = (attn, attn, attn) where attn = max 0 (round (255 - 8*(sqrt t))) - (x, y, t) = intersect_floor (alpha, beta) + (x, y, t) = intersect_floor source (alpha, beta) -- blue is beautiful, but a green tint is nice too -skycolor :: ScreenCoord -> Color -skycolor (alpha, beta) = (60, +skycolor :: Coord -> ScreenCoord -> Color +skycolor source (alpha, beta) = (60, round ((sqrt (alpha/6)) / (sqrt (90 * degrees)) * 128), round ((sqrt beta) / (sqrt (90 * degrees)) * 255) ) -pixel_color :: ScreenCoord -> Color -pixel_color (alpha, beta) - | beta > 0 = skycolor (alpha, beta) +pixel_color :: Coord -> ScreenCoord -> Color +pixel_color source (alpha, beta) + | beta > 0 = skycolor source (alpha, beta) | beta == 0 = (0, 255, 0) - | otherwise = floorcolor (alpha, beta) + | otherwise = floorcolor source (alpha, beta) cartProdTranspose xs ys = [(y,x) | x <- xs, y <- ys] cartProd xs ys = [(x,y) | x <- xs, y <- ys] @@ -87,7 +92,7 @@ coloraverage xs = ( round (fromIntegral s1/l), -- calculate color of oversampled pixels ov_color :: [ScreenCoord] -> Color -ov_color xs = coloraverage (map pixel_color xs) +ov_color xs = coloraverage (map (pixel_color eye) xs) -- list of list of (alpha, beta)-tuples ov_pixels = map oversample (cartProdTranspose betas alphas) -- cgit v1.2.3