orca/src/util/algebra.c

56 lines
1.4 KiB
C
Raw Normal View History

/************************************************************//**
*
* @file: algebra.c
* @author: Martin Fouilleul
* @date: 15/08/2023
*
*****************************************************************/
#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});
}