libmath is a simple single-header library for handling mathematical operations. It targets simple math operations, trigonometric and cyclometric functions, linear algebra, vector and matrix math etc. It is written in C programming language.
/*
* #define LIBMATH_IMPLEMENTATION:
* Include the implementation section of the header into the source file.
* NOTE: This macro should defined only ONCE in your program. Otherwise we'd cause a "multiple definition of..." error.
*
*
* #define LIBMATH_API:
* API Keyword for libmath functions. It allows for custom functions behaviour at a compilation stage
* (example: inlining, externing etc.).
*
* #define LIBMATH_USE_STDLIB:
* If defined, some libmath functions will default back to the standard library's math module.
*/#define LM_PI 3.14159265358979323846
#define LM_EPSILON 1e-6f
#define LM_NAN (0.0 / 0.0)
#define LM_INFINITY 1e10000f
#define lm_deg2rad(a) (a * (LM_PI / 180.0))
#define lm_rad2deg(a) (a * (180.0 / LM_PI))
/* ... */
#define LM_COLOR_RED lm_col(0.9, 0.2, 0.2, 1.0)
#define LM_COLOR_GREEN lm_col(0.2, 0.9, 0.2, 1.0)
#define LM_COLOR_BLUE lm_col(0.2, 0.2, 0.9, 1.0)
#define LM_COLOR_YELLOW lm_col(0.9, 0.9, 0.0, 1.0)
#define LM_COLOR_MAGENTA lm_col(0.9, 0.0, 0.9, 1.0)
#define LM_COLOR_CYAN lm_col(0.0, 0.9, 0.9, 1.0)
#define LM_COLOR_WHITE lm_col(1.0, 1.0, 1.0, 1.0)
#define LM_COLOR_BLACK lm_col(0.1, 0.1, 0.1, 1.0)
#define LM_COLOR_BLANK lm_col(0.0, 0.0, 0.0, 0.0)LM_API double lm_min(double, double);
LM_API double lm_max(double, double);
LM_API double lm_abs(double);
LM_API double lm_ceil(double);
LM_API double lm_floor(double);
LM_API double lm_round(double);
LM_API double lm_clamp(double, double, double);
LM_API double lm_clampf_zo(double);
LM_API double lm_lerp(double, double, double);
LM_API double lm_lerpf_zo(double, double, double);
LM_API double lm_pow(double, size_t);
LM_API double lm_sqr(double);
LM_API double lm_sqrt(double);
LM_API double lm_fmod(double, double);
LM_API double lm_frac(double);
LM_API size_t lm_fact(size_t);
LM_API void lm_swap(double *, double *);LM_API double lm_sin(double);
LM_API double lm_cos(double);
LM_API double lm_tan(double);
LM_API double lm_cot(double);
LM_API double lm_asin(double);
LM_API double lm_acos(double);
LM_API double lm_atan(double);
LM_API double lm_acot(double);
LM_API double lm_atan2(double, double);/* ... */
typedef union u_vec2 t_vec2;
LM_API t_vec2 lm_vec2(double, double);
LM_API t_vec2 lm_vec2_zero(void);
LM_API t_vec2 lm_vec2_cpy(t_vec2);
LM_API t_vec2 lm_vec2_add(t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_addv(t_vec2, double);
LM_API t_vec2 lm_vec2_sub(t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_subv(t_vec2, double);
LM_API t_vec2 lm_vec2_mul(t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_mulv(t_vec2, double);
LM_API t_vec2 lm_vec2_div(t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_divv(t_vec2, double);
LM_API t_vec2 lm_vec2_clamp(t_vec2, t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_clamp_zo(t_vec2);
LM_API t_vec2 lm_vec2_clamp_val(t_vec2, double, double);
LM_API t_vec2 lm_vec2_lerp(t_vec2, t_vec2, double);
LM_API t_vec2 lm_vec2_lerp_zo(t_vec2, t_vec2, double);
LM_API t_vec2 lm_vec2_dir(t_vec2, t_vec2);
LM_API t_vec2 lm_vec2_move_towards(t_vec2, t_vec2, double);
LM_API t_vec2 lm_vec2_normalize(t_vec2);
LM_API double lm_vec2_dist(t_vec2, t_vec2);
LM_API double lm_vec2_dist_sqr(t_vec2, t_vec2);
LM_API double lm_vec2_len(t_vec2);
LM_API double lm_vec2_len_sqr(t_vec2);
LM_API double lm_vec2_ang(t_vec2, t_vec2);
LM_API bool lm_vec2_eq(t_vec2, t_vec2);/* ... */
typedef union u_vec3 t_vec3;
LM_API t_vec3 lm_vec3(double, double, double);
LM_API t_vec3 lm_vec3_zero(void);
LM_API t_vec3 lm_vec3_cpy(t_vec3);
LM_API t_vec3 lm_vec3_add(t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_addv(t_vec3, double);
LM_API t_vec3 lm_vec3_sub(t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_subv(t_vec3, double);
LM_API t_vec3 lm_vec3_mul(t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_mulv(t_vec3, double);
LM_API t_vec3 lm_vec3_div(t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_divv(t_vec3, double);
LM_API t_vec3 lm_vec3_clamp(t_vec3, t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_clamp_zo(t_vec3);
LM_API t_vec3 lm_vec3_clamp_val(t_vec3, double, double);
LM_API t_vec3 lm_vec3_lerp(t_vec3, t_vec3, double);
LM_API t_vec3 lm_vec3_lerp_zo(t_vec3, t_vec3, double);
LM_API t_vec3 lm_vec3_move_towards(t_vec3, t_vec3, double);
LM_API t_vec3 lm_vec3_cross(t_vec3, t_vec3);
LM_API t_vec3 lm_vec3_normalize(t_vec3);
LM_API double lm_vec3_dist(t_vec3, t_vec3);
LM_API double lm_vec3_dist_sqr(t_vec3, t_vec3);
LM_API double lm_vec3_len(t_vec3);
LM_API double lm_vec3_len_sqr(t_vec3);
LM_API double lm_vec3_ang(t_vec3, t_vec3);
LM_API double lm_vec3_dot(t_vec3, t_vec3);
LM_API bool lm_vec3_eq(t_vec3, t_vec3);/* ... */
typedef union u_vec4 t_vec4;
LM_API t_vec4 lm_vec4(double, double, double, double);
LM_API t_vec4 lm_vec4_zero(void);
LM_API t_vec4 lm_vec4_cpy(t_vec4);
LM_API t_vec4 lm_vec4_add(t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_addv(t_vec4, double);
LM_API t_vec4 lm_vec4_sub(t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_subv(t_vec4, double);
LM_API t_vec4 lm_vec4_mul(t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_mulv(t_vec4, double);
LM_API t_vec4 lm_vec4_div(t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_divv(t_vec4, double);
LM_API t_vec4 lm_vec4_clamp(t_vec4, t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_clamp_zo(t_vec4);
LM_API t_vec4 lm_vec4_clamp_val(t_vec4, double, double);
LM_API t_vec4 lm_vec4_lerp(t_vec4, t_vec4, double);
LM_API t_vec4 lm_vec4_lerp_zo(t_vec4, t_vec4, double);
LM_API t_vec4 lm_vec4_dir(t_vec4, t_vec4);
LM_API t_vec4 lm_vec4_move_towards(t_vec4, t_vec4, double);
LM_API t_vec4 lm_vec4_normalize(t_vec4);
LM_API double lm_vec4_dist(t_vec4, t_vec4);
LM_API double lm_vec4_dist_sqr(t_vec4, t_vec4);
LM_API double lm_vec4_len(t_vec4);
LM_API double lm_vec4_len_sqr(t_vec4);
LM_API bool lm_vec4_eq(t_vec4, t_vec4);/* ... */
typedef t_vec4 t_rect;
LM_API t_rect lm_rect(double, double, double, double);
LM_API t_rect lm_rect_zero(void);
LM_API t_rect lm_rect_vec2(t_vec2, t_vec2);
LM_API bool lm_rect_aabb(t_rect, t_rect);
LM_API bool lm_rect_aabb_vec2(t_rect, t_vec2);
LM_API bool lm_rect_eq(t_rect, t_rect);/* ... */
typedef t_vec4 t_col;
LM_API t_col lm_col(double, double, double, double);
LM_API t_col lm_col_uc(unsigned char, unsigned char, unsigned char, unsigned char);
LM_API t_col lm_int2col(int);
LM_API int lm_col2int(t_col);
LM_API bool lm_col_eq(t_col, t_col);/* ... */
typedef union u_mat2 t_mat2;
LM_API t_mat2 lm_mat2_zero(void);
LM_API t_mat2 lm_mat2_identity(void);
LM_API t_mat2 lm_mat2_add(t_mat2, t_mat2);
LM_API t_mat2 lm_mat2_sub(t_mat2, t_mat2);
LM_API t_mat2 lm_mat2_mul(t_mat2, t_mat2);
LM_API t_mat2 lm_mat2_mulv(t_mat2, double);
LM_API double lm_mat2_det(t_mat2);
LM_API bool lm_mat2_eq(t_mat2, t_mat2);/* ... */
typedef union u_mat3 t_mat3;
LM_API t_mat3 lm_mat3_zero(void);
LM_API t_mat3 lm_mat3_identity(void);
LM_API t_mat3 lm_mat3_add(t_mat3, t_mat3);
LM_API t_mat3 lm_mat3_sub(t_mat3, t_mat3);
LM_API t_mat3 lm_mat3_mul(t_mat3, t_mat3);
LM_API t_mat3 lm_mat3_mulv(t_mat3, double);
LM_API double lm_mat3_det(t_mat3);
LM_API bool lm_mat3_eq(t_mat3, t_mat3);/* ... */
typedef union u_mat4 t_mat4;
LM_API t_mat4 lm_mat4_zero(void);
LM_API t_mat4 lm_mat4_identity(void);
LM_API t_mat4 lm_mat4_add(t_mat4, t_mat4);
LM_API t_mat4 lm_mat4_sub(t_mat4, t_mat4);
LM_API t_mat4 lm_mat4_mul(t_mat4, t_mat4);
LM_API t_mat4 lm_mat4_mulv(t_mat4, double);
LM_API t_mat4 lm_mat4_translate(t_vec3);
LM_API t_mat4 lm_mat4_rotate(t_vec3, double);
LM_API t_mat4 lm_mat4_scale(t_vec3);
LM_API double lm_mat4_det(t_mat4);
LM_API t_mat4 lm_mat4_ortho(double, double, double, double, double, double);
LM_API t_mat4 lm_mat4_persp(double, double, double, double);
LM_API t_mat4 lm_mat4_lookat(t_vec3, t_vec3, t_vec3);
LM_API bool lm_mat4_eq(t_mat4, t_mat4);This project is licenced under the lgpl licence.