summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 16:54:01 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2013-11-23 16:54:01 +0100
commit5a860740af315f8ab415b785205d3efad5429b21 (patch)
treedff9cad92ca17d8605886114eccc75c3f54e1cef
parenta2787b60231ffd730b8d1b3175a820a07f377fbe (diff)
downloadhaskell-5a860740af315f8ab415b785205d3efad5429b21.tar.gz
haskell-5a860740af315f8ab415b785205d3efad5429b21.tar.bz2
haskell-5a860740af315f8ab415b785205d3efad5429b21.zip
coordinates corrections
-rw-r--r--raytracer.hs37
1 files 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)