Advertisement
Guest User

Untitled

a guest
Jan 8th, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 2.01 KB | None | 0 0
  1. # Translated from the Ray Tracer Language Comparison
  2. # http://www.ffconsultancy.com/languages/ray_tracer/benchmark.html
  3.  
  4. import Printf
  5. using LinearAlgebra
  6. using StaticArrays
  7.  
  8. struct Hit
  9.     l ::Float64
  10.     d ::SVector{3,Float64}
  11. end
  12.  
  13. struct Scene
  14.     c ::SVector{3,Float64}
  15.     r ::Float64
  16.     ss ::Array{Scene, 1}
  17. end
  18.  
  19. function inter(o, d, hit, s)
  20.     v = s.c - o
  21.     b = dot(v, d)
  22.     disc = b^2 - dot(v, v) + s.r^2
  23.     disc = (disc < 0. ? NaN : sqrt(disc))
  24.     t1 = b - disc
  25.     t2 = b + disc
  26.     l = (t2 > 0. ? (t1 > 0. ? t1 : t2) : Inf)
  27.     if l > hit.l
  28.         return hit
  29.     else
  30.         if size(s.ss, 1) == 0
  31.             return Hit(l, normalize(o + l*d - s.c))
  32.         else
  33.             for s in s.ss
  34.                 hit = inter(o, d, hit, s)
  35.             end
  36.             return hit
  37.         end
  38.     end
  39. end
  40.  
  41. light = normalize(SVector(1., 3., -2.))
  42. ss = 4
  43.  
  44. function create(level, c, r)
  45.     obj = Scene(c, r, [])
  46.     if level == 1
  47.         return obj
  48.     else
  49.         a = 3*r/sqrt(12)
  50.         aux(x, z) = create(level-1, c + SVector(x, a, z), r/2)
  51.         Scene(c, 3*r, [obj, aux(-a, -a), aux(a, -a), aux(-a, a), aux(a, a)])
  52.     end
  53. end
  54.  
  55. zero3 = SVector(0., 0., 0.)
  56. hit0 = Hit(Inf, zero3)
  57.  
  58. function raytrace(dir)
  59.     hit = inter(zero3, dir, hit0, scene)
  60.     g = dot(hit.d, light)
  61.     if g < 0.0
  62.         return 0.0
  63.     else
  64.         p = hit.l * dir + sqrt(eps(1.0)) * hit.d
  65.         return (inter(p, light, hit0, scene).l < Inf ? 0.0 : g)
  66.     end
  67. end
  68.  
  69. aux(x, d) = x - n/2 + d/ss
  70.  
  71. level = 9
  72. n = 512
  73.  
  74. scene = create(level, SVector(0., -1., 4.), 1.)
  75.  
  76. function main(fdout=stdout)
  77.     Printf.@printf(fdout, "P5\n%d %d\n255", n, n)
  78.     for y in n-1:-1:0
  79.         for x in 0:n-1
  80.             g = 0.0
  81.             for d in 0:ss^2-1
  82.                 g = g + raytrace(normalize(SVector(aux(x, d%ss), aux(y, d/ss), convert(Float64, n))))
  83.             end
  84.             g = round(255*g/ss^2)
  85.             write(fdout, (isnan(g) ? 0x00 : convert(UInt8, g)))
  86.         end
  87.     end
  88. end
  89.  
  90. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement