77 lines
2.0 KiB
C
77 lines
2.0 KiB
C
/*************************************************************************
|
|
*
|
|
* Orca
|
|
* Copyright 2023 Martin Fouilleul and the Orca project contributors
|
|
* See LICENSE.txt for licensing information
|
|
*
|
|
**************************************************************************/
|
|
#include <math.h>
|
|
#include "algebra.h"
|
|
|
|
bool oc_vec2_equal(oc_vec2 v0, oc_vec2 v1)
|
|
{
|
|
return (v0.x == v1.x && v0.y == v1.y);
|
|
}
|
|
|
|
oc_vec2 oc_vec2_mul(f32 f, oc_vec2 v)
|
|
{
|
|
return ((oc_vec2){ f * v.x, f * v.y });
|
|
}
|
|
|
|
oc_vec2 oc_vec2_add(oc_vec2 v0, oc_vec2 v1)
|
|
{
|
|
return ((oc_vec2){ v0.x + v1.x, v0.y + v1.y });
|
|
}
|
|
|
|
oc_mat2x3 oc_mat2x3_mul_m(oc_mat2x3 lhs, oc_mat2x3 rhs)
|
|
{
|
|
oc_mat2x3 res;
|
|
res.m[0] = lhs.m[0] * rhs.m[0] + lhs.m[1] * rhs.m[3];
|
|
res.m[1] = lhs.m[0] * rhs.m[1] + lhs.m[1] * rhs.m[4];
|
|
res.m[2] = lhs.m[0] * rhs.m[2] + lhs.m[1] * rhs.m[5] + lhs.m[2];
|
|
res.m[3] = lhs.m[3] * rhs.m[0] + lhs.m[4] * rhs.m[3];
|
|
res.m[4] = lhs.m[3] * rhs.m[1] + lhs.m[4] * rhs.m[4];
|
|
res.m[5] = lhs.m[3] * rhs.m[2] + lhs.m[4] * rhs.m[5] + lhs.m[5];
|
|
|
|
return (res);
|
|
}
|
|
|
|
oc_mat2x3 oc_mat2x3_inv(oc_mat2x3 x)
|
|
{
|
|
oc_mat2x3 res;
|
|
res.m[0] = x.m[4] / (x.m[0] * x.m[4] - x.m[1] * x.m[3]);
|
|
res.m[1] = x.m[1] / (x.m[1] * x.m[3] - x.m[0] * x.m[4]);
|
|
res.m[3] = x.m[3] / (x.m[1] * x.m[3] - x.m[0] * x.m[4]);
|
|
res.m[4] = x.m[0] / (x.m[0] * x.m[4] - x.m[1] * x.m[3]);
|
|
res.m[2] = -(x.m[2] * res.m[0] + x.m[5] * res.m[1]);
|
|
res.m[5] = -(x.m[2] * res.m[3] + x.m[5] * res.m[4]);
|
|
return (res);
|
|
}
|
|
|
|
oc_vec2 oc_mat2x3_mul(oc_mat2x3 m, oc_vec2 p)
|
|
{
|
|
f32 x = p.x * m.m[0] + p.y * m.m[1] + m.m[2];
|
|
f32 y = p.x * m.m[3] + p.y * m.m[4] + m.m[5];
|
|
return ((oc_vec2){ x, y });
|
|
}
|
|
|
|
oc_mat2x3 oc_mat2x3_rotate(f32 radians)
|
|
{
|
|
const f32 sinRot = sinf(radians);
|
|
const f32 cosRot = cosf(radians);
|
|
oc_mat2x3 rot = {
|
|
cosRot, -sinRot, 0,
|
|
sinRot, cosRot, 0
|
|
};
|
|
return rot;
|
|
}
|
|
|
|
oc_mat2x3 oc_mat2x3_translate(f32 x, f32 y)
|
|
{
|
|
oc_mat2x3 translate = {
|
|
1, 0, x,
|
|
0, 1, y
|
|
};
|
|
return translate;
|
|
}
|