4 #:vec2
#:make-vec2
#:vec2-x
#:vec2-y
6 #:vec
#:make-vec
#:v
#:vec-x
#:vec-y
#:vec-z
7 #:v.
#:v
+ #:v-
#:v
* #:norm
#:normalize
9 #:m
#:rotation-matrix
#:m
*
10 #:vec-i
#:make-vec-i
#:vec-i-x
#:vec-i-y
#:vec-i-z
11 #:v.-i
#:v
+-i
#:v--i
#:v
*-i
#:norm-i
))
15 ;;;; double-float 2 vector
17 `(simple-array double-float
(2)))
19 (defstruct (vec2 (:type
(vector double-float
)))
24 (values double-float
&optional
))
25 (let ((x (vec2-x vec2
))
27 (sqrt (+ (* x x
) (* y y
)))))
29 ;;;; double-float 3 vector
32 `(simple-array double-float
(3)))
34 (defstruct (vec (:type
(vector double-float
)))
35 (x 0d0
) (y 0d0
) (z 0d0
))
38 `(simple-array double-float
(3 3)))
40 (defun v (&optional
(x 0d0
) (y 0d0
) (z 0d0
))
41 (declare (double-float x y z
)
42 (values vec
&optional
))
44 :element-type
'double-float
45 :initial-contents
(list x y z
)))
48 "Dot product between two vectors."
50 (values double-float
&optional
))
52 (declare (double-float sum
))
54 (incf sum
(* (aref a i
)
59 (values vec
&optional
))
60 (v (- (* (aref a
1) (aref b
2))
61 (* (aref a
2) (aref b
1)))
62 (- (* (aref a
2) (aref b
0))
63 (* (aref a
0) (aref b
2)))
64 (- (* (aref a
0) (aref b
1))
65 (* (aref a
1) (aref b
0)))))
70 (declaim (ftype (function (vec vec
)
71 (values vec
&optional
))
73 (defmacro v-op
(op a b
)
74 "Subtracting and adding vectors."
77 (setf (aref result i
) (,op
(aref ,a i
)
86 "Subtract two vectors."
89 #+nil
(defun v* (a scalar
)
90 "Multiply vector with scalar."
91 (declare (double-float scalar
)
93 (values vec
&optional
))
96 (setf (aref result i
) (* scalar
(aref a i
))))
100 "Multiply vector with scalar."
101 (declare (double-float scalar
)
103 (values vec
&optional
))
106 (setf (aref result i
) (* scalar
(aref a i
))))
109 (defmacro v
* (a scalar
)
111 `(%v
* ,a
(load-time-value (* 1d0
,scalar
)))
118 (declaim (ftype (function (vec)
119 (values double-float
&optional
))
122 "Length of a vector."
124 (declare (type (double-float 0d0
) l2
)) ;; Otherwise warning with complex-double
128 (declaim (ftype (function (vec)
129 (values vec
&optional
))
132 "Rescale vector to unit length."
133 (let ((len (norm a
)))
141 (declaim (ftype (function (double-float double-float double-float
142 double-float double-float double-float
143 double-float double-float double-float
)
144 (values mat
&optional
))
146 (defun m (a b c d e f g h i
)
148 :element-type
'double-float
149 :initial-contents
(list (list a b c
) (list d e f
) (list g h i
))))
151 (defun rotation-matrix (angle vect
)
152 "Create matrix that rotates by ANGLE radians around the direction
153 VECT. VECT must be normalized."
154 (declare ((double-float 0d0
#.
(* 2d0 pi
)) angle
)
156 (values mat
&optional
))
157 (let* ((u (aref vect
0))
178 (rotation-matrix (/ pi
2) (v 0d0
0d0
1d0
))
180 (defun m* (matrix vect
)
181 "Multiply MATRIX with VECT. Copies 4th component w from VECT into
183 (declare (mat matrix
)
185 (values vec
&optional
))
190 (* (aref matrix i j
) (aref vect j
)))))
193 (m* (rotation-matrix (/ pi
2) (v 0d0
0d0
1d0
)) (v 1d0
))
202 `(simple-array fixnum
(3)))
204 (defstruct (vec-i (:type
(vector fixnum
)))
209 (values fixnum
&optional
))
210 (+ (* (vec-i-x a
) (vec-i-x b
))
211 (* (vec-i-y a
) (vec-i-y b
))
212 (* (vec-i-z a
) (vec-i-z b
))))
214 (declaim (ftype (function (vec-i vec-i
)
215 (values vec-i
&optional
))
218 (make-vec-i :x
(- (vec-i-x a
) (vec-i-x b
))
219 :y
(- (vec-i-y a
) (vec-i-y b
))
220 :z
(- (vec-i-z a
) (vec-i-z b
))))
222 (make-vec-i :x
(+ (vec-i-x a
) (vec-i-x b
))
223 :y
(+ (vec-i-y a
) (vec-i-y b
))
224 :z
(+ (vec-i-z a
) (vec-i-z b
))))
228 (values double-float
&optional
))
229 (sqrt (* 1d0
(v.-i a a
))))
231 (defun v*-i
(a scalar
)
232 "Multiply vector with scalar."
233 (declare (fixnum scalar
)
235 (values vec-i
&optional
))
236 (let* ((result (make-vec-i)))
238 (setf (aref result i
) (* scalar
(aref a i
))))