summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 12:53:30 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 12:53:30 +0100
commit8ce2fc1ea007276ca41f2ba27cf75a035e19245b (patch)
tree0f09cc165c503e9276919cc78b9081c8c83ab4fe
parent65778a8af5c39932a4fcca89df23ec9d4b200704 (diff)
downloadhaskell-8ce2fc1ea007276ca41f2ba27cf75a035e19245b.tar.gz
haskell-8ce2fc1ea007276ca41f2ba27cf75a035e19245b.tar.bz2
haskell-8ce2fc1ea007276ca41f2ba27cf75a035e19245b.zip
change types
-rw-r--r--raytracer.hs37
1 files 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)