Log In  


Cart #vector_p8-5 | 2024-05-25 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
8

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
8


i got an error loading it up


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...


1

Excellent! Thank you for sharing.


This is great, thank you!

Two questions:

  1. v_polar seems to invert x and y, shouldn't it be x=l*cos(a) and y=l*sin(a)?
  2. from my experiments, it looks like v_proj is projecting b on a, instead of a on b (as stated in the description)

It's been a while since I studied trig, so I may have gotten both completely wrong :)



[Please log in to post a comment]