-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.scm
55 lines (48 loc) · 1.71 KB
/
util.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(define-module util
(use srfi-27)
(use math.const)
(use vec :prefix v:)
(export-all))
(select-module util)
(define (random-in-unit-sphere)
(let loop ((p (v:diff (v:scale (v:vec3 (random-real) (random-real) (random-real)) 2)
(v:vec3 1 1 1))))
(if (< (v:sq-len p) 1)
p
(loop (v:diff (v:scale (v:vec3 (random-real) (random-real) (random-real)) 2)
(v:vec3 1 1 1))))))
(define (random-in-unit-disk)
(let loop ((p (v:diff (v:scale (v:vec3 (random-real) (random-real) 0) 2)
(v:vec3 1 1 0))))
(if (< (v:dot p p) 1)
p
(loop (v:diff (v:scale (v:vec3 (random-real) (random-real) 0) 2)
(v:vec3 1 1 0))))))
(define (random-dir-over-hemisphere n)
(let loop ()
(let ((p (v:scale (v:diff (v:vec3 (random-real) (random-real) (random-real))
(v:vec3 0.5 0.5 0.5))
2)))
(if (>= (v:sq-len p) 1)
(loop)
(let ((dir (v:unit p)))
(if (< (v:dot dir n) 0)
(v:scale dir -1)
dir))))))
(define (random-cosine-direction)
(let* ((r1 (random-real))
(r2 (random-real))
(z (sqrt (- 1 r2)))
(phi (* 2 pi r1))
(x (* (cos phi) 2 (sqrt r2)))
(y (* (sin phi) 2 (sqrt r2))))
(v:vec3 x y z)))
(define (random-to-sphere radius distance-sq)
(let* ((r1 (random-real))
(r2 (random-real))
(z (+ 1 (* r2 (- (sqrt (- 1 (/ (* radius radius)
distance-sq))) 1))))
(phi (* 2 pi r1))
(x (* (cos phi) (sqrt (- 1 (* z z)))))
(y (* (sin phi) (sqrt (- 1 (* z z))))))
(v:vec3 x y z)))