matrix2by2.h

来自「VC视频对象的跟踪提取原代码(vc视频监控源码)」· C头文件 代码 · 共 227 行

H
227
字号
/*************************************************************** * C - C++ Header * * File : 	Matrix2by2.h * * Module :	Matrix2by2 * * Author : 	A M Baumberg (CoMIR) * * Creation Date : Tue Jun  4 11:47:24 1996  * * Comments : 	basic 2 by 2 matrix * ***************************************************************/#ifndef __MATRIX_2_BY_2__#define __MATRIX_2_BY_2__#include <math.h>#include <iostream>#include <stdlib.h>#include "Point2.h"#include "text_output.h"namespace ReadingPeopleTracker{class Matrix2by2{public:        realno val00;    realno val01;    realno val10;    realno val11;            // constructors        // null    Matrix2by2()	{	    val00 = val01 = val10 = val11 = 0;	}        // scalar multiple of the identity    Matrix2by2(realno b) 	{	    val00 = val11 = b; val01 = val10 = 0;	}        // diagonal    Matrix2by2(realno b00, realno b11) 	{	    val00 = b00; val11 = b11; val01 = val10 = 0;	}        // symmetric    Matrix2by2(realno b00, realno b01, realno b11)	{	    val00 = b00; val01 = val10 = b01; val11 = b11;	}        // full    Matrix2by2(realno b00, realno b01, realno b10, realno b11)	{	    val00 = b00; val01 = b01; val10 = b10; val11 = b11;	}        Matrix2by2(const Matrix2by2 &b)	{	    val00 = b.val00; val01 = b.val01; 	    val10 = b.val10; val11 =  b.val11;	}        // functions        inline Matrix2by2 add(const Matrix2by2 &b)	{	    return Matrix2by2(val00 + b.val00, val01 + b.val01, 			      val10 + b.val10, val11 + b.val11);	}        inline Matrix2by2 subtract(const Matrix2by2 &b)	{	    return Matrix2by2(val00 - b.val00, val01 - b.val01,			      val10 - b.val10, val11 - b.val11);	}        inline Matrix2by2 multiply(const Matrix2by2 &b)	{	    return Matrix2by2(val00 * b.val00 + val01 * b.val10,			      val00 * b.val01 + val01 * b.val11,			      val10 * b.val00 + val11 * b.val10,			      val10 * b.val01 + val11 * b.val11);	}            inline Matrix2by2 transpose()	{	    return Matrix2by2(val00, val10, val01, val11);	}        inline void operator+=(const Matrix2by2 &b)	{ 	    val00 += b.val00; val01 += b.val01;	    val10 += b.val10; val11 += b.val11;	}        inline void operator-=(const Matrix2by2 &b)	{ 	    val00 -= b.val00; val01 -= b.val01;	    val10 -= b.val10; val11 -= b.val11;	}        inline Point2 multiply(Point2 v)	{	    return Point2(val00 * v.x + val01 * v.y,			  val10 * v.x + val11 * v.y);	}        inline realno determinant()	{	    return val00 * val11 - val01 * val10;	}        inline realno check_determinant()	{	    realno det = determinant();	    if (fabs(det) < 1e-30)	    {		cerror << " Matrix2by2::check_determinant(): det < 1e-30, aborting..."		       << endl;		abort();	    }	    return det;	}        inline Matrix2by2 inverse()	{	    realno det = check_determinant();	    return Matrix2by2(val11 / det, -val01 / det,			      -val10 / det, val00 / det);	}        inline bool inverse(Matrix2by2 &res)	{	    realno det = determinant();	    if (fabs(det) < 1e-30)		return false;	    res = Matrix2by2(val11 / det, -val01 / det,			     -val10 / det, val00 / det);	    return true;	}         inline Matrix2by2 scale(realno b)	{	    return Matrix2by2(val00 * b, val01 * b, val10 * b, val11 * b);	}        inline void operator*=(realno b)	{	    val00 *= b; val01 *= b; val10 *= b; val11 *= b;	}        inline Matrix2by2 divide(realno b)	{	    return Matrix2by2(val00 / b, val01 / b, val10 / b, val11 / b);	}            inline void get_real_eigenvalues(realno &e1, realno &e2)	{	    realno tmp1 = val00 + val11;	    realno tmp2 = val00 - val11;	    tmp2 = sqrt(tmp1 * tmp2 + (4 * val01 * val10));	    e1 = tmp1 + tmp2;	    e2 = tmp1 - tmp2;	}        inline realno get_max_real_eigenvalue()	{	    realno tmp = val00 - val11;	    return val00 + val11 + sqrt(tmp * tmp + (4 * val01 * val10));	}        inline realno get_min_real_eigenvalue()	{	    realno tmp = val00 - val11;	    return val00 + val11 - sqrt(tmp * tmp + (4 * val01 * val10));	}          };inline ostream &operator<<(ostream &strm_out, const Matrix2by2 &m){    strm_out << "[ " << m.val00 << "  " << m.val01 << " ]" << endl;    strm_out << "[ " << m.val10 << "  " << m.val11 << " ]" << endl;    return strm_out;}inline Matrix2by2 operator+(Matrix2by2 a, Matrix2by2 b){    return a.add(b);} inline Matrix2by2 operator-(Matrix2by2 a, Matrix2by2 b){     return a.subtract(b);}inline Matrix2by2 operator*(Matrix2by2 a, Matrix2by2 b){    return a.multiply(b); }inline Point2 operator*(Matrix2by2 a, Point2 b){    return a.multiply(b); }} // namespace ReadingPeopleTracker#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?