2D vector
Immutable 2D vector class.
The vectors are immutable when used through this API and it is highly discouraged to change a vector in place as this may break future code.
Simple usage example:
local v = lug.V2(3, 4) print(v:norm()) --> 5 -- Access x component can be done with #x method or `[1]`. print(v[1], v:x()) --> 2 2 -- Add two vectors print(v + lug.V2(2, 1)) --> (5 5)
Constructor
.new (x, y)
          
                    Create a vector with the corresponding components.
-- Create new vector from two numbers. local v = lug.V2(0.5, 12)
Conversion
With a single argument, lug.V2 returns a vector by copying the first two values of the argument ([] accessor). This enables easy transformation from other vectors such as lug.V3 or lug.V4.
-- Copy x and y values from a lug.V3. local v2 = lug.V2(v3)
.polarUnit (theta)
          
                    A unit vector with \(\theta\) polar coordinate.
Constants
.zero ()
          
                    Vector (0, 0).
.ox ()
          
                    Unit vector (1, 0).
.oy ()
          
                    Unit vector (0, 1).
.huge ()
          
                    A vector whose components are math.huge.
.negHuge ()
          
                    A vector whose components are -math.huge.
Accessors
:x ()
          
                    Get x component. Also supported as v[1] which is faster.
:y ()
          
                    Get y component. Also supported as v[2] which is faster.
:tuple ()
          
                    Get x, y components as tuple.
:tostring ()
          
                    A textual representation of the vector.
Functions
Functions neg, add, sub and smul are also accessible through operators:
local v = lug.V2(1,2) local nv = -v local w = v + nv local n = 4 * v local m = v * 3
.neg (v)
          
                    Inverse vector \(-\mathbf{v}\).
.add (u, v)
          
                    Add two vectors: \(\mathbf{u} + \mathbf{v}\).
.sub (u, v)
          
                    Subtract two vectors: \(\mathbf{u} - \mathbf{v}\).
.mul (u, v)
          
                    Component wise multiplication: \((\ \mathbf{u}_x \mathbf{v}_x,\ \ \mathbf{u}_y \mathbf{v}_y\ )\).
.div (u, v)
          
                    Component wise division: \((\ \mathbf{u}_x / \mathbf{v}_x,\ \ \mathbf{u}_y / \mathbf{v}_y\ )\).
.smul (s, v)
          
                    Scalar multiplication: \(s\mathbf{v}\).
.half (v)
          
                    Half vector: \(\mathbf{v} / 2\).
.dot (u, v)
          
                    Dot product: \(\mathbf{u}\cdot\mathbf{v}\).
.norm (v)
          
                    Norm: \(|\mathbf{v}|\).
.norm2 (v)
          
                    Squared norm: \(|\mathbf{v}|^2\).
.unit (v)
          
                    Unit vector: \(\mathbf{v}/|\mathbf{v}|\).
.ortho (v)
          
                    Rotated vector by \(\pi/2\).
.mix (u, v, t)
          
                    Linear interpolation \(\mathbf{u} + t(\mathbf{v}-\mathbf{u})\).
Taversal
.map (v, f)
          
                    Map coordinates wifh f function: \((\ f(\mathbf{v}_x),\ \ f(\mathbf{v}_y)\ )\).
.mapi (v, f)
          
                    Map coordinates with f function passing i: \((\ f(1,\mathbf{v}_x),\ \ f(2,\mathbf{v}_y)\ )\).
.fold (v, acc, f)
          
                    Fold vector coordinates with accumulator acc: \(f(f(acc, \mathbf{v}_x), \mathbf{v}_y)\).
.foldi (v, acc, f)
          
                    Fold vector coordinates with accumulator acc and index: \(f(f(acc, 1, \mathbf{v}_x), 2, \mathbf{v}_y)\).
.iter (v, f)
          
                    Iterator against coordinate values: \(f(\mathbf{v}_x);\ f(\mathbf{v}_y)\). If no f function is passed, the iterator is expected to be used in a for loop:
for c in v:iter() do -- do something with coordinate value c end
.iteri (v, f)
          
                    Iterator against coordinate values with index: \(f(1, \mathbf{v}_x);\ f(1, \mathbf{v}_y)\). If no f function is passed, the iterator is expected to be used in a for loop:
for i, c in v:iteri() do -- do something with index i and coordinate value c end
Predicates
.forAll (v, p)
          
                    True if all \(p(v_i)\) are true: \(p(\mathbf{v}_x) \land p(\mathbf{v}_y)\).
.exists (v, p)
          
                    True if any \(p(v_i)\) is true: \(p(\mathbf{v}_x) \lor p(\mathbf{v}_y)\)
.eq (u, v, eq)
          
                    True if u and v are equal component wise: \(\mathbf{u}_x = \mathbf{v}_x \land \mathbf{u}_y = \mathbf{v}_y\)
If eq function is provided, it is used to evaluate equality.
.lt (u, v, lt)
          
                    True if u is lower then v component wise: \(\mathbf{u}_x < \mathbf{v}_x \land \mathbf{u}_y < \mathbf{v}_y\)
If lt function is provided, it is used as comparison function.
.le (u, v, le)
          
                    True if u is lower or equal to v component wise: \(\mathbf{u}_x \leq \mathbf{v}_x \land \mathbf{u}_y \leq \mathbf{v}_y\)
If le function is provided, it is used as comparison function.
.compare (u, v, cmp)
          
                    Compare two vectors and return:
| -1 | if \(\mathbf{u}_x < \mathbf{v}_x \lor (\mathbf{u}_x = \mathbf{v}_x \land \mathbf{u}_y < \mathbf{v}_y)\) | 
| 0 | if \(\mathbf{u}_x = \mathbf{v}_x \land \mathbf{u}_y = \mathbf{v}_y\) | 
| 1 | if \(\mathbf{u}_x > \mathbf{v}_x \lor (\mathbf{u}_x = \mathbf{v}_x \land \mathbf{u}_y > \mathbf{v}_y)\) | 
If cmp function is provided, it is used as comparison function (should return -1, 0, 1).
Operators
.__unm = lib.neg
          
                    Inverse vector \(-\mathbf{v}\).
.__add = lib.add
          
                    Add two vectors: \(\mathbf{u} + \mathbf{v}\).
.__sub = lib.sub
          
                    Subtract two vectors: \(\mathbf{u} - \mathbf{v}\).
.__mul = lib.smul
          
                    Scalar multiplication: \(s\mathbf{v}\).
.__tostring = lib.tostring
          
                    A textual representation of the vector. Used in print(v) for example.
.__eq = lib.eq
          
                    Component wise equality
.__lt = lib.lt
          
                    Same as lt.
.__le = lib.le
          
                    Same as le.
