Files
asteroids/maths.c
2025-10-18 17:43:22 +01:00

112 lines
1.8 KiB
C

#include "maths.h"
#include <math.h>
float vec2_len(vec2_t v)
{
return sqrtf(v.x * v.x + v.y * v.y);
}
vec2_t vec2_add(vec2_t v1, vec2_t v2)
{
return (vec2_t) { v1.x + v2.x, v1.y + v2.y };
}
vec2_t vec2_sub(vec2_t v1, vec2_t v2)
{
return (vec2_t) { v1.x - v2.x, v1.y - v2.y };
}
vec2_t vec2_scale(vec2_t v, float s)
{
return (vec2_t) { s * v.x, s * v.y };
}
vec3_t vec2_extend(vec2_t v)
{
return (vec3_t) { v.x, v.y, 1 };
}
vec2_t vec2_norm(vec2_t v)
{
const float l = vec2_len(v);
return (vec2_t) {
v.x / l,
v.y / l,
};
}
float vec2_dot(vec2_t v1, vec2_t v2)
{
return v1.x * v2.x + v1.y * v2.y;
}
vec2_t vec3_reduce(vec3_t v)
{
return (vec2_t) { v.x / v.z, v.y / v.z };
}
mat2_t mat2_rotation(float theta)
{
return (mat2_t) {
{ cosf(theta), sinf(theta) },
{ -sinf(theta), cosf(theta) },
};
}
vec2_t mat2_mul_vec2(mat2_t m, vec2_t v)
{
return (vec2_t) {
m.x.x * v.x + m.y.x * v.y,
m.x.y * v.x + m.y.y * v.y,
};
}
mat2_t mat2_mul_mat2(mat2_t m1, mat2_t m2)
{
#define ELEM(i, j) m1.x.j *m2.i.x + m1.y.j *m2.i.y
return (mat2_t) {
{ ELEM(x, x), ELEM(x, y) },
{ ELEM(y, x), ELEM(y, y) },
};
#undef ELEM
}
mat3_t mat2_extend(mat2_t m)
{
return (mat3_t) {
{ m.x.x, m.x.y, 0 },
{ m.y.x, m.y.y, 0 },
{ 0, 0, 1 },
};
}
mat3_t mat3_translation(vec2_t v)
{
return (mat3_t) {
{ 1, 0, 0 },
{ 0, 1, 0 },
{ v.x, v.y, 1 },
};
}
vec3_t mat3_mul_vec3(mat3_t m, vec3_t v)
{
return (vec3_t) {
m.x.x * v.x + m.y.x * v.y + m.z.x * v.z,
m.x.y * v.x + m.y.y * v.y + m.z.y * v.z,
m.x.z * v.x + m.y.z * v.y + m.z.z * v.z,
};
}
mat3_t mat3_mul_mat3(mat3_t m1, mat3_t m2)
{
#define ELEM(i, j) m1.x.j *m2.i.x + m1.y.j *m2.i.y + m1.z.j *m2.i.z
return (mat3_t) {
{ ELEM(x, x), ELEM(x, y), ELEM(x, z) },
{ ELEM(y, x), ELEM(y, y), ELEM(y, z) },
{ ELEM(z, x), ELEM(z, y), ELEM(z, z) },
};
#undef ELEM
}