Blame c++/perspective/src/matrix.cpp

Ivan Mahonin 14f971
#include "matrix.h"
Ivan Mahonin 14f971
Ivan Mahonin 14f971
Ivan Mahonin 14f971
Real
Ivan Mahonin 4dc49c
Matrix3::det() const {
Ivan Mahonin 4dc49c
    return m00*(m11*m22 - m12*m21)
Ivan Mahonin 4dc49c
         + m01*(m12*m20 - m10*m22)
Ivan Mahonin 4dc49c
         + m02*(m10*m21 - m11*m20);
Ivan Mahonin 4dc49c
}
Ivan Mahonin 4dc49c
Ivan Mahonin 4dc49c
Matrix3
Ivan Mahonin 4dc49c
Matrix3::inverted(bool *success) const {
Ivan Mahonin 4dc49c
	const Real rm00 = m11*m22 - m12*m21;
Ivan Mahonin 4dc49c
	const Real rm10 = m12*m20 - m10*m22;
Ivan Mahonin 4dc49c
	const Real rm20 = m10*m21 - m11*m20;
Ivan Mahonin 4dc49c
	const Real d = m00*rm00 + m01*rm10 + m02*rm20;
Ivan Mahonin 4dc49c
	
Ivan Mahonin 4dc49c
	Real k;
Ivan Mahonin 4dc49c
	if (fabs(d) > real_precision) {
Ivan Mahonin 4dc49c
		k = 1/d;
Ivan Mahonin 4dc49c
		if (success) *success = true;
Ivan Mahonin 4dc49c
	} else {
Ivan Mahonin 4dc49c
		k = 0;
Ivan Mahonin 4dc49c
		if (success) *success = false;
Ivan Mahonin 4dc49c
	}
Ivan Mahonin 4dc49c
	
Ivan Mahonin 4dc49c
	return Matrix3(
Ivan Mahonin 4dc49c
		Vector3( m11*m22 - m12*m21,
Ivan Mahonin 4dc49c
				 m02*m21 - m01*m22,
Ivan Mahonin 4dc49c
				 m01*m12 - m02*m11 )*k,
Ivan Mahonin 4dc49c
		Vector3( m12*m20 - m10*m22,
Ivan Mahonin 4dc49c
				 m00*m22 - m02*m20,
Ivan Mahonin 4dc49c
				 m02*m10 - m00*m12 )*k,
Ivan Mahonin 4dc49c
		Vector3( m10*m21 - m11*m20,
Ivan Mahonin 4dc49c
				 m01*m20 - m00*m21,
Ivan Mahonin 4dc49c
				 m00*m11 - m01*m10 )*k );
Ivan Mahonin 4dc49c
}
Ivan Mahonin 4dc49c
Ivan Mahonin 4dc49c
Ivan Mahonin 4dc49c
Real
Ivan Mahonin 0662a2
Matrix4::det() const {
Ivan Mahonin 0662a2
    return m00 * (m11*(m22*m33 - m23*m32) + m12*(m23*m31 - m21*m33) + m13*(m21*m32 - m22*m31))
Ivan Mahonin 0662a2
         + m01 * (m01*(m23*m32 - m22*m33) + m02*(m21*m33 - m23*m31) + m03*(m22*m31 - m21*m32))
Ivan Mahonin 0662a2
         + m02 * (m01*(m12*m33 - m13*m32) + m02*(m13*m31 - m11*m33) + m03*(m11*m32 - m12*m31))
Ivan Mahonin 0662a2
         + m03 * (m01*(m13*m22 - m12*m23) + m02*(m11*m23 - m13*m21) + m03*(m12*m21 - m11*m22));
Ivan Mahonin 0662a2
}
Ivan Mahonin 14f971
Ivan Mahonin 14f971
Matrix4
Ivan Mahonin a1942e
Matrix4::inverted() const {
Ivan Mahonin 0662a2
	Matrix4 r;
Ivan Mahonin 0662a2
	r.m00 = m11*(m22*m33 - m23*m32) + m12*(m23*m31 - m21*m33) + m13*(m21*m32 - m22*m31);
Ivan Mahonin 0662a2
	r.m10 = m10*(m23*m32 - m22*m33) + m12*(m20*m33 - m23*m30) + m13*(m22*m30 - m20*m32);
Ivan Mahonin 0662a2
	r.m20 = m10*(m21*m33 - m23*m31) + m11*(m23*m30 - m20*m33) + m13*(m20*m31 - m21*m30);
Ivan Mahonin 0662a2
	r.m30 = m10*(m22*m31 - m21*m32) + m11*(m20*m32 - m22*m30) + m12*(m21*m30 - m20*m31);
Ivan Mahonin 0662a2
Ivan Mahonin 0662a2
	double det = m00*r.m00 + m01*r.m10 + m02*r.m20 + m03*r.m30;
Ivan Mahonin 0662a2
	if (fabs(det) <= real_precision) return zero();
Ivan Mahonin 0662a2
	det = 1/det;
Ivan Mahonin 0662a2
	r.m00 *= det;
Ivan Mahonin 0662a2
	r.m10 *= det;
Ivan Mahonin 0662a2
	r.m20 *= det;
Ivan Mahonin 0662a2
	r.m30 *= det;
Ivan Mahonin 0662a2
Ivan Mahonin 0662a2
	r.m01 = det*(m01*(m23*m32 - m22*m33) + m02*(m21*m33 - m23*m31) + m03*(m22*m31 - m21*m32));
Ivan Mahonin 0662a2
	r.m11 = det*(m00*(m22*m33 - m23*m32) + m02*(m23*m30 - m20*m33) + m03*(m20*m32 - m22*m30));
Ivan Mahonin 0662a2
	r.m21 = det*(m00*(m23*m31 - m21*m33) + m01*(m20*m33 - m23*m30) + m03*(m21*m30 - m20*m31));
Ivan Mahonin 0662a2
	r.m31 = det*(m00*(m21*m32 - m22*m31) + m01*(m22*m30 - m20*m32) + m02*(m20*m31 - m21*m30));
Ivan Mahonin 0662a2
	r.m02 = det*(m01*(m12*m33 - m13*m32) + m02*(m13*m31 - m11*m33) + m03*(m11*m32 - m12*m31));
Ivan Mahonin 0662a2
	r.m12 = det*(m00*(m13*m32 - m12*m33) + m02*(m10*m33 - m13*m30) + m03*(m12*m30 - m10*m32));
Ivan Mahonin 0662a2
	r.m22 = det*(m00*(m11*m33 - m13*m31) + m01*(m13*m30 - m10*m33) + m03*(m10*m31 - m11*m30));
Ivan Mahonin 0662a2
	r.m32 = det*(m00*(m12*m31 - m11*m32) + m01*(m10*m32 - m12*m30) + m02*(m11*m30 - m10*m31));
Ivan Mahonin 0662a2
	r.m03 = det*(m01*(m13*m22 - m12*m23) + m02*(m11*m23 - m13*m21) + m03*(m12*m21 - m11*m22));
Ivan Mahonin 0662a2
	r.m13 = det*(m00*(m12*m23 - m13*m22) + m02*(m13*m20 - m10*m23) + m03*(m10*m22 - m12*m20));
Ivan Mahonin 0662a2
	r.m23 = det*(m00*(m13*m21 - m11*m23) + m01*(m10*m23 - m13*m20) + m03*(m11*m20 - m10*m21));
Ivan Mahonin 0662a2
	r.m33 = det*(m00*(m11*m22 - m12*m21) + m01*(m12*m20 - m10*m22) + m02*(m10*m21 - m11*m20));
Ivan Mahonin 0662a2
	return r;
Ivan Mahonin 14f971
}