summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 13:43:10 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 13:43:10 +0100
commitdb54b4c67b6f75a732b44c1080795c69fd4f6c63 (patch)
tree89f1f6e3067efe1828d8ae4204ff6997dc0e365f
parent8ce2fc1ea007276ca41f2ba27cf75a035e19245b (diff)
downloadhaskell-db54b4c67b6f75a732b44c1080795c69fd4f6c63.tar.gz
haskell-db54b4c67b6f75a732b44c1080795c69fd4f6c63.tar.bz2
haskell-db54b4c67b6f75a732b44c1080795c69fd4f6c63.zip
include source into color calc functions
-rw-r--r--raytracer.hs39
1 files 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)