fastmath.vector

Mathematical vector operations.

Types

  • Fixed size (custom types):
    • Vec2 - 2d vector, creator vec2
    • Vec3 - 3d vector, creator vec3
    • Vec4 - 4d vector, creator vec4
    • ArrayVec - fixed size vector as double array, n-dimensional, creator arrayvec
  • Variable size:
    • Clojure’s PersistentVector, creator [].

VectorProto defines most of the functions.

Vectors implements also:

  • Sequable
  • Sequencial
  • IFn
  • Counted
  • Reversible
  • Indexed
  • ILookup
  • equals and toString from Object

That means that vectors can be destructured, treated as sequence or called as a function. See vec2 for examples.

Constants

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))))
;;=> 38.25969938176571

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.1297230074913197, 1.0]

generate-vec3

(generate-vec3 f1 f2 f3)(generate-vec3 f)

Generate Vec3 with fn(s)

Examples

Usage

(generate-vec3 rand)
;;=> #vec3 [0.4943294026267051, 0.545817976171441, 0.9876600662316933]
(generate-vec3 rand (constantly 1) (constantly 2))
;;=> #vec3 [0.44704388479149915, 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.18089882195673135, 0.7452064777657577, 0.3448101170604563, 0.16563039659813883]
(generate-vec4 rand rand (constantly 1) (constantly 2))
;;=> #vec4 [0.3018766119580053, 0.6994588450315288, 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.3283846104771855

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__33462#] (* 2.0 p1__33462#)) (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)])
;;=> [59 94]
(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)])
;;=> [21 -96]
(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]