X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=csrMath.h;fp=csrMath.h;h=63e5bd0e29115a0ddbb1d11f809d4eed48f27a4b;hp=c758afca1f66fa96f1e1615df7dc371282c8f29d;hb=8aa3bce0394bff13b44ea3cd84a47f5880fd7527;hpb=0399aad1d7374badf037a2696d9e276d71b7a297 diff --git a/csrMath.h b/csrMath.h index c758afc..63e5bd0 100644 --- a/csrMath.h +++ b/csrMath.h @@ -181,7 +181,41 @@ void v3_fill( v3f a, float v ) a[2] = v; } +// Matrix 3x3 +//====================================================================================================== +void m3x3_inv_transpose( m3x3f src, m3x3f dest ) +{ + float a = src[0][0], b = src[0][1], c = src[0][2], + d = src[1][0], e = src[1][1], f = src[1][2], + g = src[2][0], h = src[2][1], i = src[2][2]; + + float det = 1.f / + (+a*(e*i-h*f) + -b*(d*i-f*g) + +c*(d*h-e*g)); + + dest[0][0] = (e*i-h*f)*det; + dest[1][0] = -(b*i-c*h)*det; + dest[2][0] = (b*f-c*e)*det; + dest[0][1] = -(d*i-f*g)*det; + dest[1][1] = (a*i-c*g)*det; + dest[2][1] = -(a*f-d*c)*det; + dest[0][2] = (d*h-g*e)*det; + dest[1][2] = -(a*h-g*b)*det; + dest[2][2] = (a*e-d*b)*det; +} + +void m3x3_mulv( m3x3f m, v3f v, v3f d ) +{ + v3f res; + + res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2]; + res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2]; + res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2]; + + v3_copy( res, d ); +} // Matrix 4x3 // ================================================================================================================== @@ -191,6 +225,27 @@ void v3_fill( v3f a, float v ) { 0.0f, 0.0f, 1.0f, },\ { 0.0f, 0.0f, 0.0f }} +void m4x3_to_3x3( m4x3f a, m3x3f b ) +{ + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); + v3_copy( a[2], b[2] ); +} + +void m4x3_copy( m4x3f a, m4x3f b ) +{ + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); + v3_copy( a[2], b[2] ); + v3_copy( a[3], b[3] ); +} + +void m4x3_identity( m4x3f a ) +{ + m4x3f id = M4X3_IDENTITY; + m4x3_copy( id, a ); +} + void m4x3_mul( m4x3f a, m4x3f b, m4x3f d ) { float