7 (defmacro with-vector
(vector-form names
&body form
)
8 (destructuring-bind (x y z
) names
9 (assert (and (symbolp x
) (symbolp y
) (symbolp z
)))
10 `(multiple-value-bind (,x
,y
,z
) ,vector-form
(progn ,@form
))))
12 (defun vector-magnitude (v)
13 (with-vector v
(vx vy vz
) (+ (* vx vx
) (* vy vy
) (* vz vz
))))
15 (defun vector-normal (v)
16 (with-vector v
(vx vy vz
)
17 (let ((mag (/ (1.0
(vector-magnitude v
)))))
19 :x
(* (vector-x v
) length
)
20 :y
(* (vector-y v
) length
)
21 :z
(* (vector-z v
) length
)))))
23 (defun vector-dot (v0 v1
)
24 (with-vector v0
(v0x v0y v0z
)
25 (with-vector v1
(v1x v1y v1z
)
30 (defun vector-cross (v0 v1
)
31 (with-vector v0
(v0x v0y v0z
)
32 (with-vector v1
(v1x v1y v1z
)
41 (defmacro vector-binary-op
(v0 v1 op
)
42 (with-vector v0
(v0x v0y v0z
)
43 (with-vector v1
(v1x v1y v1z
)
45 :x
(funcall ,op v0x v1x
)
46 :y
(funcall ,op v0y v1y
)
47 :z
(funcall ,op v0z v1z
)))))
49 (defun vector-add (v0 v1
)
50 (vector-binary-op v0 v1
#'+))
52 (defun vector+ (v0 v1
)
53 (vector-binary-op v0 v1
#'+))
55 (defun vector-sub (v0 v1
)
56 (vector-binary-op v0 v1
#'-
))
58 (defun vector-neg (v0)
62 :z
(- (vector-z v0
))))
64 (defmacro vector-
(v0 &optional
(v1 nil vector-sub-binary-p
))
65 (if (vector-sub-binary-p)
69 (defun vector* (v0 s op
)
70 (with-vector v0
(vx vy vz
)
72 :x
(* (vector-x v0
) s
)
73 :y
(* (vector-y v0
) s
)
74 :z
(* (vector-z v0
) s
))))