# vector.p8

a simple and lightweight (in tokens) vector math library for PICO-8.

usage:

`load #vector_p8`

and save as such: vector.p8- remove all the demo code; it's in the second tab
`#include`

in any cart you want

## functions within:

> NOTE:

> vectors are just normal Lua tables with `x`

and `y`

fields, so you can pass any table that contains `x`

and `y`

to any of the functions and they will still work

### creation and management

`vector(x,y)`

- the main function. `x`

and `y`

default to `0`

`v_polar(angle, length)`

- makes a new vector using polar coordinates

`v_rnd()`

- returns a normalized vector with a random direction

`v_copy(v)`

- returns a copy of `v`

`v_unpack(v)`

- returns the components of `v`

separately

`v_tostr(v)`

- turns a vector into a string, appropriate for both debugging and normal output. it looks like `[x, y]`

### actual math

`v_add(a,b)`

- returns `a`

+ `b`

`v_sub(a,b)`

- returns `a`

- `b`

`v_scale(v,n)`

- returns `v`

scaled by `n`

`v_mul(v,n)`

- alias for `v_scale`

`v_div(v,n)`

- returns `v`

scaled by the inverse of `n`

`v_dot(a,b)`

- returns the dot product of `a`

and `b`

`v_magsq(v)`

- returns the squared magnitude of `v`

`v_mag(v)`

- returns the magnitude of `v`

`v_distsq(a,b)`

- returns the squared distance between `a`

and `b`

`v_dist(a,b)`

- returns the distance between `a`

and `b`

`v_norm(v)`

- returns `v`

, normalized

`v_perp(v)`

- returns a vector clockwise-perpendicular to `v`

`v_proj(a,b)`

- returns the projection of `a`

onto `b`

`v_dir(a,b)`

- returns a normalized vector that points towards `b`

, with origin at `a`

.

### rotation related functions

`v_rot(v,t)`

- returns `v`

rotated by `t`

.

`v_angle(v)`

- returns the angle denoted by `v`

### miscellaneous

`v_lerp(a,b,t)`

- linearly interpolates from `a`

to `b`

by `t`

`v_flr(v)`

- returns `v`

, with all its components floored

## constants

> **WARNING!**

> because of the way Lua tables work, do **NOT** use compound assignments to alter a variable if you directly assign one of these constants to it. either copy the constant using `v_cpy`

and then assign that to the variable or use one of the functions within the library to manipulate it.

`v_right`

- rightwards pointing vector.

`v_left`

- leftwards pointing vector.

`v_up`

- upwards pointing vector. Y points downward in 2D so this vector points towards -Y.

`v_down`

- downwards pointing vector. Y points downward in 2D so this vector points towards +Y.

`v_one`

- identity vector. all components are set to 1.

`v_center`

- utility vector pointing towards the center of the screen, i.e. [64,64].

## changelog

v2.0 (24-05-2024):

almost a 50% reduction on tokens, in exchange for various breaking changes:

- removed
`v_eq`

,`v_zero`

,`v_atwds`

,`v_isvec`

,`v_arr`

and`v_sprj`

- removed z component from all functions, the 3D constants and
`v_cross`

as in, this library no longer supports 3D math. sorry. it was oddly shoehorned in though,

so I really wouldn't have relied on it that much. - added
`v_dir`

, taken from a mod of the library done by snale - optimized
`v_lerp`

,`v_sub`

and`v_rot`

`v_proj`

now uses the proper definition for vector projection- extended the names of some functions:
`v_cpy`

->`v_copy`

`v_unpck`

->`v_unpack`

`v_scl`

->`v_scale`

`v_ang`

->`v_angle`

`v_cntr`

->`v_center`

`v_dst`

->`v_dist`

`v_dstsq`

->`v_distsq`

v1.2.1 (11-03-2023):

- thought I had fixed all functions that used
`v_getd`

, but turns out one function I hadn't added to the docs,`v_flr`

, still used it. - documented
`v_flr`

. - improved explanation for
`v_atwds`

.

v1.2 (06-12-2022):

- fixed the math functions
`v_add`

,`v_sub`

,`v_scl`

,`v_div`

and`v_neg`

using the now-defunct`v_getd`

function.

v1.1 (09-11-2022):

- removed all dimension related functions.

Consequently, a parameter was added to v_tostr for it to know how to format the output. - added
`v_sprj`

and`v_proj`

. - renamed
`v_center`

to`v_cntr`

.

v1.0 (09-11-2022):

- initial release

oh yeah, right, the cart here has a demo, you gotta remove that code and then you can use the lib. I gotta put that in the post...

[Please log in to post a comment]