From 8ce2fc1ea007276ca41f2ba27cf75a035e19245b Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 23 Nov 2013 12:53:30 +0100 Subject: change types --- raytracer.hs | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/raytracer.hs b/raytracer.hs index b77445b..57427c2 100644 --- a/raytracer.hs +++ b/raytracer.hs @@ -4,6 +4,11 @@ import Data.Char -- P3 width height maxcolorval r g b r g b r g b ... -- max line length: 70 + +type Angle = Double +type ScreenCoord = (Angle, Angle) +type Color = (Int, Int, Int) + degrees = pi / 180 eye = [0, 0, 2] @@ -17,7 +22,7 @@ beta2 = -30 * degrees w = 1000 h = 500 -oversampling = 2 -- each pixel is 2x2 rays +oversampling = 1 -- each pixel is 2x2 rays ov_alphaoffset = ((alpha2 - alpha1) / (w-1)) / oversampling ov_betaoffset = ((beta2 - beta1) / (h-1)) / oversampling @@ -30,31 +35,31 @@ 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 :: Double -> Double -> (Double, Double, Double) -intersect_floor alpha beta +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) ) | otherwise = (0, 0, 0) -floorcolor :: Double -> Double -> (Int, Int, Int) -floorcolor alpha beta +floorcolor :: ScreenCoord -> Color +floorcolor (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 (alpha, beta) -- blue is beautiful, but a green tint is nice too -skycolor :: Double -> Double -> (Int, Int, Int) -skycolor alpha beta = (60, +skycolor :: ScreenCoord -> Color +skycolor (alpha, beta) = (60, round ((sqrt (alpha/6)) / (sqrt (90 * degrees)) * 128), round ((sqrt beta) / (sqrt (90 * degrees)) * 255) ) -pixel_color :: Double -> Double -> (Int, Int, Int) -pixel_color alpha beta - | beta > 0 = skycolor alpha beta +pixel_color :: ScreenCoord -> Color +pixel_color (alpha, beta) + | beta > 0 = skycolor (alpha, beta) | beta == 0 = (0, 255, 0) - | otherwise = floorcolor alpha beta + | otherwise = floorcolor (alpha, beta) cartProdTranspose xs ys = [(y,x) | x <- xs, y <- ys] cartProd xs ys = [(x,y) | x <- xs, y <- ys] @@ -66,14 +71,14 @@ tuple2sum x y = (a1 + b1, a2 + b2) (b1, b2) = y -- from one pixel (alpha, beta), get a list of oversampled pixels -oversample :: (Double, Double) -> [(Double, Double)] +oversample :: ScreenCoord -> [ScreenCoord] oversample (a,b) = map (tuple2sum (a,b)) (cartProd ov_alphaoffsets ov_betaoffsets) tuple3sum x y = (a1 + b1, a2 + b2, a3 + b3) where (a1, a2, a3) = x (b1, b2, b3) = y -coloraverage :: [(Int, Int, Int)] -> (Int, Int, Int) +coloraverage :: [Color] -> Color coloraverage xs = ( round (fromIntegral s1/l), round (fromIntegral s2/l), round (fromIntegral s3/l) ) @@ -81,8 +86,8 @@ coloraverage xs = ( round (fromIntegral s1/l), l = fromIntegral (length xs) -- calculate color of oversampled pixels -ov_color :: [(Double, Double)] -> (Int, Int, Int) -ov_color xs = coloraverage (map (uncurry pixel_color) xs) +ov_color :: [ScreenCoord] -> Color +ov_color xs = coloraverage (map pixel_color xs) -- list of list of (alpha, beta)-tuples ov_pixels = map oversample (cartProdTranspose betas alphas) -- cgit v1.2.3