fastmath.vector
Mathematical vector operations.
Types
- Fixed size (custom types):
- Variable size:
- Clojure’s PersistentVector, creator
[]
.
- Clojure’s PersistentVector, creator
VectorProto defines most of the functions.
Vectors implements also:
Sequable
Sequencial
IFn
Counted
equals
andtoString
fromObject
That means that vectors can be destructured, treated as sequence or called as a function. See vec2 for examples.
Categories
- Distance / length: dist dist-abs dist-canberra dist-cheb dist-cos dist-discrete dist-emd dist-sq distances limit mag magsq normalize set-mag
- Creators: array->vec2 array->vec3 array->vec4 array-vec generate-vec2 generate-vec3 generate-vec4 to-vec vec2 vec3 vec4
- Geometric: aligned? angle-between axis-rotate base-from cross dot faceforward from-polar heading mag magsq perpendicular relative-angle-between rotate to-polar transform
- Operations: abs add applyf approx average-vectors div econstrain ediv einterpolate emn emult emx interpolate is-near-zero? is-zero? maxdim mindim mn mult mx permute reciprocal sub sum
Other vars: ->ArrayVec ->Vec2 ->Vec3 ->Vec4
Constants
- TOLERANCE =
1.0E-6
aligned?
(aligned? v1 v2)
Are vectors aligned (have the same direction)?
Examples
Usage
(aligned? (vec2 1.0 1.0) (vec2 2.0 2.000001))
;;=> true
(aligned? (vec2 1.0 1.0) (vec2 2.0 2.00001))
;;=> false
angle-between
(angle-between v1 v2)
Angle between two vectors
See also relative-angle-between.
Examples
Usage
(m/degrees (angle-between (vec3 1.0 0.0 0.0) (vec3 0.0 1.0 0.0)))
;;=> 90.0
(m/degrees (angle-between (vec (repeatedly 50 rand))
(vec (repeatedly 50 rand))))
;;=> 47.161618536684216
array->vec2
(array->vec2 a)
Doubles array to Vec2
Examples
Usage
(array->vec2 (double-array [11 22 33 44 55]))
;;=> #vec2 [11.0, 22.0]
array->vec3
(array->vec3 a)
Doubles array to Vec3
Examples
Usage
(array->vec3 (double-array [11 22 33 44 55]))
;;=> #vec3 [11.0, 22.0, 33.0]
array->vec4
(array->vec4 a)
Doubles array to Vec4
Examples
Usage
(array->vec4 (double-array [11 22 33 44 55]))
;;=> #vec4 [11.0, 22.0, 33.0, 44.0]
array-vec
(array-vec xs)
Make ArrayVec type based on provided sequence xs
.
Examples
Usage
(array-vec [1 2 3 4 5 6 7])
;;=> #arrayvec [1.0 2.0 3.0 4.0 5.0 6.0 7.0]
(array-vec (range 0.0 1.0 0.25))
;;=> #arrayvec [0.0 0.25 0.5 0.75]
Operations
(nth (array-vec [9 8 7 6]) 2)
;;=> 7.0
(count (array-vec (range 0.1 1.0 0.05)))
;;=> 18
(seq (array-vec [1 2]))
;;=> (1.0 2.0)
average-vectors
(average-vectors init vs)
(average-vectors vs)
Average / centroid of vectors. Input: initial vector (optional), list of vectors
Examples
Usage
(average-vectors [[1 2] [0 1] [3 4] [1 2] [4 -1]])
;;=> [1.8 1.6]
(average-vectors (vec2 0 0) [(vec2 1 1) (vec2 1 1) (vec2 1 1)])
;;=> #vec2 [0.75, 0.75]
dist
(dist v1 v2)
Euclidean distance between vectors
Examples
Usage
(dist (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 8.246211251235321
(dist [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 5.477225575051661
dist-abs
(dist-abs v1 v2)
Manhattan distance between vectors
Examples
Usage
(dist-abs (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 14.0
(dist-abs [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 10.0
dist-canberra
(dist-canberra v1 v2)
Canberra distance
Examples
Usage
(dist-canberra (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 3.0
(dist-canberra [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 1.4563492063492063
dist-cheb
(dist-cheb v1 v2)
Chebyshev distance between 2d vectors
Examples
Usage
(dist-cheb (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 6.0
(dist-cheb [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 4.0
dist-cos
(dist-cos v1 v2)
Cosine distance
Examples
Usage
(dist-cos (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 1.8082903768654761
(dist-cos [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 0.041122268700070075
dist-discrete
(dist-discrete v1 v2)
Discrete distance between 2d vectors
Examples
Usage
(dist-discrete (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 3.0
(dist-discrete [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 4.0
dist-emd
(dist-emd v1 v2)
Earth Mover’s Distance
Examples
Usage
(dist-emd (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 4.0
(dist-emd [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 10.0
dist-sq
(dist-sq v1 v2)
Squared Euclidean distance between vectors
Examples
Usage
(dist-sq (vec4 1.0 2.0 -1.0 -2.0) (vec4 1.0 -2.0 3.0 4.0))
;;=> 68.0
(dist-sq [9 8 7 6 5 4 3 2 1] [9 8 7 6 5 5 5 5 5])
;;=> 30.0
distances
Examples
List of distances
(sort (keys distances))
;;=> (:abs :canberra :cheb :cosine :discrete :emd :euclid :euclid-sq)
ediv
(ediv v1 v2)
Element-wise division of two vectors.
Examples
Usage
(ediv (vec2 1 3) (vec2 2 4))
;;=> #vec2 [0.5, 0.75]
faceforward
(faceforward n v)
Flip normal n
to match the same direction as v
.
Examples
Usage
(faceforward (vec2 1.0 1.0) (vec2 -1.0 -3.0))
;;=> #vec2 [-1.0, -1.0]
(faceforward (vec2 1.0 1.0) (vec2 1.0 0.0))
;;=> #vec2 [1.0, 1.0]
generate-vec2
(generate-vec2 f1 f2)
(generate-vec2 f)
Generate Vec2 with fn(s)
Examples
Usage
(generate-vec2 (constantly 2))
;;=> #vec2 [2.0, 2.0]
(generate-vec2 rand (constantly 1))
;;=> #vec2 [0.697630937175877, 1.0]
generate-vec3
(generate-vec3 f1 f2 f3)
(generate-vec3 f)
Generate Vec3 with fn(s)
Examples
Usage
(generate-vec3 rand)
;;=> #vec3 [0.7647454284518005, 0.5842367293138117, 0.265160233333921]
(generate-vec3 rand (constantly 1) (constantly 2))
;;=> #vec3 [0.19307355930574954, 1.0, 2.0]
generate-vec4
(generate-vec4 f1 f2 f3 f4)
(generate-vec4 f)
Generate Vec4 with fn(s)
Examples
Usage
(generate-vec4 rand)
;;=> #vec4 [0.6069732943238529, 0.2876383248893867, 0.17534206875108982, 0.735895590853345]
(generate-vec4 rand rand (constantly 1) (constantly 2))
;;=> #vec4 [0.27615015939034804, 0.35372506403915827, 1.0, 2.0]
limit
(limit v len)
Limit length of the vector by given value
Examples
Usage
(limit (vec3 1.0 1.0 1.0) 1.0)
;;=> #vec3 [0.5773502691896258, 0.5773502691896258, 0.5773502691896258]
(limit (vec3 1.0 1.0 1.0) 2.0)
;;=> #vec3 [1.0, 1.0, 1.0]
normalize
(normalize v)
Normalize vector (set length = 1.0)
Examples
Usage
(normalize (vec2 1.0 -1.0))
;;=> #vec2 [0.7071067811865475, -0.7071067811865475]
relative-angle-between
(relative-angle-between v1 v2)
Angle between two vectors relative to each other.
See also angle-between.
Examples
Usage
(m/degrees (relative-angle-between (vec3 1.0 0.0 0.0)
(vec3 0.0 1.0 0.0)))
;;=> 90.0
(m/degrees (relative-angle-between (vec (repeatedly 50 rand))
(vec (repeatedly 50 rand))))
;;=> 3.594635633914216
set-mag
(set-mag v len)
Set length of the vector
Examples
Usage
(set-mag (vec2 0.22 0.22) (m/sqrt 2.0))
;;=> #vec2 [1.0000000000000002, 1.0000000000000002]
(set-mag (vec2 1.0 1.0) 0.0)
;;=> #vec2 [0.0, 0.0]
TOLERANCE
const
;;=> 1.0E-6
Tolerance used in is-near-zero?. Values less than this value are treated as zero.
vec2
(vec2 x y)
Make 2d vector
Examples
Usage
(vec2 0.5 -0.5)
;;=> #vec2 [0.5, -0.5]
Destructuring
(let [[x y] (vec2 4.3 2.2)] (+ x y))
;;=> 6.5
As function
[((vec2 11 22) 0) ((vec2 11 22) 1)]
;;=> [11.0 22.0]
As sequence
(map (fn* [p1__32512#] (* 2.0 p1__32512#)) (vec2 1 2))
;;=> (2.0 4.0)
(reduce clojure.core/+ (vec2 6 4))
;;=> 10.0
(cons 6.0 (vec2 3 4))
;;=> (6.0 3.0 4.0)
(first (vec2 3 4))
;;=> 3.0
(second (vec2 3 4))
;;=> 4.0
(last (vec2 3 4))
;;=> 4.0
(nth (vec2 3 4) 1)
;;=> 4.0
(filter clojure.core/neg? (vec2 -1 2))
;;=> (-1.0)
Count
(count (vec2 4 3))
;;=> 2
vec3
(vec3 x y z)
(vec3 v z)
Make Vec2 vector
Examples
Usage
(vec3 0.5 -0.5 1.0)
;;=> #vec3 [0.5, -0.5, 1.0]
(let [v (vec2 1 2)] (vec3 v -1.0))
;;=> #vec3 [1.0, 2.0, -1.0]
vec4
(vec4 x y z w)
(vec4 v w)
(vec4 v z w)
Make Vec4 vector
Examples
Usage
(vec4 0.5 -0.5 1.0 -1.0)
;;=> #vec4 [0.5, -0.5, 1.0, -1.0]
(let [v (vec2 1 2)] (vec4 v -1.0 0.1))
;;=> #vec4 [1.0, 2.0, -1.0, 0.1]
(let [v (vec3 0 1 2)] (vec4 v 0.1))
;;=> #vec4 [0.0, 1.0, 2.0, 0.1]
VectorProto
protocol
Vector operations
members
abs
(abs v1)
Absolute value of vector elements
Examples
Usage
(abs (array-vec [-1 2 -2 1]))
;;=> #arrayvec [1.0 2.0 2.0 1.0]
add
(add v1)
(add v1 v2)
Sum of two vectors.
Examples
Usage
(add (vec2 1 2) (vec2 -1 -2))
;;=> #vec2 [0.0, 0.0]
applyf
(applyf v f)
Apply function to all vector values (like map but returns the same type).
Examples
Usage
(applyf [5 3] (fn [v] (m/sin v)))
;;=> [-0.9589242746631386 0.1411200080598671]
approx
(approx v)
(approx v d)
Round to 2 (or d
) decimal places
Examples
Usage
(approx (vec2 (m/sin -1) (m/cos 1)))
;;=> #vec2 [-0.84, 0.54]
(approx (vec2 (m/sin -1) (m/cos 1)) 6)
;;=> #vec2 [-0.841471, 0.540302]
axis-rotate
(axis-rotate v1 angle axis)
(axis-rotate v1 angle axis pivot)
Rotate around axis, 3d only
Examples
Usage
(axis-rotate (vec3 1.0 0.0 0.0) m/HALF_PI (vec3 0.0 1.0 0.0))
;;=> #vec3 [6.12323399538461E-17, 0.0, -1.0]
(axis-rotate (vec3 1.0 0.0 0.0)
m/HALF_PI
(vec3 0.0 1.0 0.0)
(vec3 1.0 1.0 1.0))
;;=> #vec3 [0.0, 0.0, 0.9999999999999999]
base-from
(base-from v)
List of perpendicular vectors (basis)
Examples
Usage
(base-from (vec3 0.1 1.0 -1.0))
;;=> [#vec3 [0.1, 1.0, -1.0]
;;=> #vec3 [0.0, -0.7071067811865475, -0.7071067811865475]
;;=> #vec3 [-1.414213562373095, 0.07071067811865475, -0.07071067811865475]]
(base-from (vec2 1.0 0.0))
;;=> [#vec2 [1.0, 0.0] #vec2 [-0.0, 1.0]]
cross
(cross v1 v2)
Cross product
Examples
Usage
(cross (vec3 1 2 3) (vec3 4 3 2))
;;=> #vec3 [-5.0, 10.0, -5.0]
(cross (vec2 1 2) (vec2 -1 2))
;;=> 4.0
div
(div v1 v)
Divide vector by number v
Examples
Usage
(div [5 4 3 5] 4.0)
;;=> [1.25 1.0 0.75 1.25]
dot
(dot v1 v2)
Dot product of two vectors.
Examples
Usage
(dot (vec4 1 0 0 0) (vec4 -1 0 -1 0))
;;=> -1.0
econstrain
(econstrain v val1 val2)
Element-wise constrain
Examples
Usage
(econstrain (vec3 2 0 -2) -1 1)
;;=> #vec3 [1.0, 0.0, -1.0]
einterpolate
(einterpolate v1 v2 v)
(einterpolate v1 v2 v f)
Interpolate vectors element-wise, optionally set interpolation fn
Examples
Usage
(einterpolate (vec2 -1 -1) (vec2 1 1) (vec2 0.25 0.75))
;;=> #vec2 [-0.5, 0.5]
(einterpolate (vec2 -1 -1)
(vec2 1 1)
(vec2 0.25 0.75)
m/smooth-interpolation)
;;=> #vec2 [-0.6875, 0.6875]
emn
(emn v1 v2)
Element-wise min from two vectors.
Examples
Usage
(emn [-1 2] [1 -2])
;;=> [-1 -2]
emult
(emult v1 v)
Element-wise vector multiplication (Hadamard product).
Examples
Usage
(emult (vec3 1 2 3) (vec3 9 9 9))
;;=> #vec3 [9.0, 18.0, 27.0]
emx
(emx v1 v2)
Element-wise max from two vectors.
Examples
Usage
(emx [-1 2] [1 -2])
;;=> [1 2]
from-polar
(from-polar v1)
From polar coordinates (2d, 3d only)
Examples
Usage
(from-polar (vec2 1.0 (m/radians 90)))
;;=> #vec2 [6.12323399538461E-17, 1.0]
(from-polar (vec3 1.0 (m/radians 90) (m/radians 45)))
;;=> #vec3 [0.7071067811865476, 0.7071067811865475, 6.12323399538461E-17]
Usage
(to-polar (vec2 1.0 1.0))
;;=> #vec2 [1.4142135623730951, 0.7853981633974483]
(to-polar (vec3 1.0 0.0 1.0))
;;=> #vec3 [1.4142135623730951, 0.7853981633974483, 0.0]
heading
(heading v1)
Angle between vector and unit vector [1,0,...]
Examples
Usage
(m/degrees (heading (vec2 1.0 1.0)))
;;=> 45.0
(m/degrees (heading (vec3 1.0 0.0 1.0)))
;;=> 45.0
(m/degrees (heading (vec4 1.0 -1.0 1.0 -1.0)))
;;=> 59.99999999999999
(heading [1 2 3 4 5 6 7 8 9])
;;=> 1.5115267439240436
(heading (array-vec [1 2 3 4 5 6 7 8 9]))
;;=> 1.5115267439240436
interpolate
(interpolate v1 v2 t)
(interpolate v1 v2 t f)
Interpolate vectors, optionally set interpolation fn
Examples
Usage
(interpolate (vec2 -1 -1) (vec2 1 1) 0.25)
;;=> #vec2 [-0.5, -0.5]
(interpolate (vec2 -1 -1) (vec2 1 1) 0.25 m/smooth-interpolation)
;;=> #vec2 [-0.6875, -0.6875]
is-near-zero?
(is-near-zero? v1)
Is vector almost zero? (all absolute values of elements are less than TOLERANCE
)
Examples
Usage
(is-near-zero? [0 1.0E-7])
;;=> true
(is-near-zero? [0 1.0E-6])
;;=> false
is-zero?
(is-zero? v1)
Is vector zero?
Examples
Usage
(is-zero? [0 1.0E-7])
;;=> false
(is-zero? [0 0.0])
;;=> true
mag
(mag v1)
length of the vector.
Examples
Length of the vector
(mag (vec2 1 1))
;;=> 1.4142135623730951
;; Test: ok.
magsq
(magsq v1)
Length of the vector squared.
Examples
Length of the vector, squared
(magsq [1 2 1 2])
;;=> 10.0
;; Test: ok.
maxdim
(maxdim v)
Index of maximum value.
Examples
Usage
(let [v (vec (repeatedly 100 (fn [] (- (int (rand-int 200)) 100))))
mdim (maxdim v)]
[mdim (v mdim)])
;;=> [26 98]
(maxdim (vec3 1 2 3))
;;=> 2
mindim
(mindim v)
Index of minimum value.
Examples
Usage
(let [v (vec (repeatedly 100 (fn [] (- (int (rand-int 200)) 100))))
mdim (mindim v)]
[mdim (v mdim)])
;;=> [48 -83]
(mindim (vec3 1 2 3))
;;=> 0
mn
(mn v1)
Minimum value of vector elements
Examples
Usage
(mn (vec4 -1 -2 3 4))
;;=> -2.0
mult
(mult v1 v)
Multiply vector by number v
.
Examples
Usage
(mult (vec4 5 4 3 5) 4.0)
;;=> #vec4 [20.0, 16.0, 12.0, 20.0]
mx
(mx v1)
Maximum value of vector elements
Examples
Usage
(mx (vec4 -1 -2 3 4))
;;=> 4.0
permute
(permute v idxs)
Permute vector elements with given indices.
Examples
Usage
(permute (vec4 1 2 3 4) (vec4 0 3 2 1))
;;=> #vec4 [1.0, 4.0, 3.0, 2.0]
perpendicular
(perpendicular v1)
(perpendicular v1 v2)
Perpendicular vector (only 2d).
Examples
Usage
(perpendicular (vec2 -4 0))
;;=> #vec2 [-0.0, -1.0]
(perpendicular (vec3 1.0 0.0 0.0) (vec3 0.0 -1.0 0.0))
;;=> #vec3 [0.0, 0.0, -1.0]
reciprocal
(reciprocal v)
Reciprocal of elements.
Examples
Usage
(reciprocal (vec3 1 2 5))
;;=> #vec3 [1.0, 0.5, 0.2]
rotate
(rotate v1 angle)
(rotate v1 anglex angley anglez)
Rotate vector
Examples
Usage
(rotate (vec2 1 2) (m/radians 90))
;;=> #vec2 [-2.0, 1.0000000000000002]
(rotate (vec3 1 2 3) (m/radians 90) 0 0)
;;=> #vec3 [1.0, -3.0, 2.0]
sub
(sub v1)
(sub v1 v2)
Subtraction of two vectors.
Examples
Usage
(sub (vec2 1 2) (vec2 -1 -2))
;;=> #vec2 [2.0, 4.0]
sum
(sum v1)
Sum of elements
Examples
Usage
(sum (vec (range 1000)))
;;=> 499500
to-polar
(to-polar v1)
To polar coordinates (2d, 3d only), first element is length, the rest angle.
to-vec
(to-vec v)
Convert to Clojure primitive vector Vec
.
Examples
Check types
(type (to-vec [1 2 3]))
;;=> class clojure.core.Vec
(type (to-vec (vec2 1 2)))
;;=> class clojure.core.Vec
(type (to-vec (vec3 1 2 3)))
;;=> class clojure.core.Vec
(type (to-vec (vec4 1 2 3 4)))
;;=> class clojure.core.Vec
(type (to-vec (array-vec 1)))
;;=> class clojure.core.Vec
transform
(transform v1 o vx vy)
(transform v1 o vx vy vz)
Transform vector; map point to coordinate system defined by origin, vx and vy (as bases), 2d and 3d only.
Examples
Usage
(transform (vec2 1 1) (vec2 -1 -1) (vec2 1.0 0.0) (vec2 0.0 1.0))
;;=> #vec2 [0.0, 0.0]
(transform (vec3 1 1 1)
(vec3 -1 -1 0)
(vec3 1.0 0.0 1.0)
(vec3 0.0 1.0 0.0)
(vec3 0.0 1.0 1.0))
;;=> #vec3 [0.0, 1.0, 2.0]