112 lines
1.8 KiB
C
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
|
|
}
|