forked from inconvergent/weird
-
Notifications
You must be signed in to change notification settings - Fork 0
/
3rnd.lisp
76 lines (62 loc) · 1.77 KB
/
3rnd.lisp
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(in-package :rnd)
(veq:vdef* 3on-line ((veq:varg 3 a b))
(declare #.*opt* (veq:ff a b))
(veq:f3from a (veq:f3- b a) (rnd)))
(veq:vdef* 3non-line (n (veq:varg 3 a b))
(declare #.*opt* (veq:ff a b))
(veq:fwith-arrays (:n n :itr k
:arr ((arr 3))
:fxs ((f () (3on-line a b)))
:exs ((arr k (f))))
arr))
(veq:vdef* 3in-box ((veq:varg 3 s))
(declare #.*opt* (veq:ff s))
(values (rnd* (veq:vref s 0))
(rnd* (veq:vref s 1))
(rnd* (veq:vref s 2))))
(veq:vdef* 3in-cube (s)
(declare #.*opt* (veq:ff s))
(3in-box s s s))
(veq:vdef* 3nin-box (n (veq:varg 3 s))
(declare #.*opt* (veq:ff s))
(veq:fwith-arrays (:n n :itr k
:arr ((a 3))
:fxs ((f () (3in-box s)))
:exs ((a k (f))))
a))
(veq:vdef* 3nin-cube (n s)
(declare #.*opt* (veq:ff s))
(veq:fwith-arrays (:n n :itr k
:arr ((a 3))
:fxs ((f () (3in-cube s)))
:exs ((a k (f))))
a))
(veq:vdef* 3on-sphere (rad)
(declare #.*opt* (veq:ff rad))
(mvb (a b) (norm)
(declare (veq:ff a b))
(let ((c (norm)))
(declare (veq:ff c))
(veq:f3scale a b c (/ rad (veq:f3len a b c))))))
(veq:vdef* 3in-sphere (rad)
(declare #.*opt* (veq:ff rad))
(veq:f3let ((cand (values 0f0 0f0 0f0)))
(loop while t
do (veq:f3vset cand (values (rnd*) (rnd*) (rnd*)))
(when (< (veq:f3len2 cand) 1f0)
(return-from 3in-sphere
(veq:f3scale cand rad))))))
(veq:vdef* 3non-sphere (n rad)
(declare #.*opt* (veq:ff rad))
(veq:fwith-arrays (:n n :itr k
:arr ((a 3))
:fxs ((f () (3on-sphere rad)))
:exs ((a k (f))))
a))
(veq:vdef* 3nin-sphere (n rad)
(declare #.*opt* (veq:ff rad))
(veq:fwith-arrays (:n n :itr k
:arr ((a 3))
:fxs ((f () (3in-sphere rad)))
:exs ((a k (f))))
a))