亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xmatrixfunc.cpp

?? XMathLib是一個通用的3D圖形數學庫。 其中包含兩個部分: XMathLib和XGeomLib。分別處理數學和幾何運算。 數學部分包含向量、矩陣、四元數的運算。以及其它的運算。 幾何部分
?? CPP
字號:
/********************************************************************************
聲明:
  這里的代碼版權歸潘李亮所有.你可以自由使用分發這些代碼.但是不得用于商業用途.
  如有需要請于作者聯系.
   在你使用本代碼時候,請務必保留本聲明
    潘李亮 2003-10
	Stanly Lee. 2003-10

	Email : xheartblue@etang.com

	提供矩陣和向量等類的操作函數.這些函數不屬于任何一個類.
	使用這些類可以加快運算速度.函數不需要返回.參數以引用
	的方式傳遞.




	*******************************************************************************/


#include "XMathLib.h"
namespace XMathLib
{

    void XMatrix3x3::From(XMatrix& _m)
    {
        for( int r = 0 ; r< 3; r++)
            for(int c = 0 ; c < 3 ; c++)
            {
                m[r][c] = _m.m[r][c];
            }
    }

    void XMatrix::From(XMatrix3x3& _m)
    {
        //效率不高。要改。但是必要不大
        LoadIdentity();
        for( int r = 0 ; r< 3; r++)
            for(int c = 0 ; c < 3 ; c++)
            {
                m[r][c] = _m.m[r][c];
            }
    }

	bool	_MATH_LIB_EXPORT_ XMatrix_Inv(XMatrix3x3& m1 , XMatrix3x3& mOut)
	{
		XMatrix3x3 m = m1;
		int max_r;
		//int max_c;
		float pivot = 1.0;
		mOut.LoadIdentity();
		for(int row = 0 ; row < 3 ; row++ )
		{
			//選主元.
			pivot = m.m[row][row];

			max_r = row;
			for( int i = row ; i < 3 ; i++ )
			{
				float t = (float)fabs(m.m[i][row]);

				if( t > fabs(pivot))
				{
					pivot = m.m[i][row];
					max_r = i;
				}
			}
			//主元選定.
			if(pivot == 0)
				return false;
			//交換行
			if(max_r != row)
			{
				XM_Swap(m.m[max_r][0],m.m[row][0]); 	XM_Swap(mOut.m[max_r][0],mOut.m[row][0]);
				XM_Swap(m.m[max_r][1],m.m[row][1]); 	XM_Swap(mOut.m[max_r][1],mOut.m[row][1]);
				XM_Swap(m.m[max_r][2],m.m[row][2]); 	XM_Swap(mOut.m[max_r][2],mOut.m[row][2]);
			}

			//歸一化到1

			for( int x = 0 ; x < 3 ; x ++)
			{
				mOut.m[row][x] /= pivot;
				m.m[row][x] /= pivot; 
			}

			//消去當前列,除了當前行上的以外。該列全部成為0
			for(int y = 0 ; y < 3 ; y ++)
			{
				if(y == row )
					continue;
				float times = m.m[y][row];
				//消去。
				for (int x = 0 ; x < 3 ; x ++)
				{
					m.m[y][x] -= m.m[row][x] * times;  
					mOut.m[y][x] -= mOut.m[row][x] * times;
				}
			}

		}

		return true;

	}




	/*
	*	逆矩陣,采用高斯消去法.
	*/
	/*******************************************************************************
	This function is tested by Stanly Lee at 2003-11
	*******************************************************************************/
	bool _MATH_LIB_EXPORT_ XMatrix_Inv(XMatrix&m1 , XMatrix& mOut)
	{
		XMatrix m = m1;
		int max_r;
		//int max_c;
		float pivot = 1.0;
		mOut.LoadIdentity();
		for(int row = 0 ; row < 4 ; row++ )
		{
			//選主元.
			pivot = m.m[row][row];

			max_r = row;
			for( int i = row ; i < 4 ; i++ )
			{
				float t = (float)fabs(m.m[i][row]);

				if( t > fabs(pivot))
				{
					pivot = m.m[i][row];
					max_r = i;
				}
			}
			//主元選定.
			if(pivot == 0)
				return false;
			//交換行
			if(max_r != row)
			{
				XM_Swap(m.m[max_r][0],m.m[row][0]); 	XM_Swap(mOut.m[max_r][0],mOut.m[row][0]);
				XM_Swap(m.m[max_r][1],m.m[row][1]); 	XM_Swap(mOut.m[max_r][1],mOut.m[row][1]);
				XM_Swap(m.m[max_r][2],m.m[row][2]); 	XM_Swap(mOut.m[max_r][2],mOut.m[row][2]);
				XM_Swap(m.m[max_r][3],m.m[row][3]);  	XM_Swap(mOut.m[max_r][3],mOut.m[row][3]);
			}

			//歸一化到1

			for( int x = 0 ; x < 4 ; x ++)
			{
				mOut.m[row][x] /= pivot;
				m.m[row][x] /= pivot; 
			}

			//消去當前列,除了當前行上的以外。該列全部成為0
			for(int y = 0 ; y < 4 ; y ++)
			{
				if(y == row )
					continue;
				float times = m.m[y][row];
				//消去。
				for (int x = 0 ; x < 4 ; x ++)
				{
					m.m[y][x] -= m.m[row][x] * times;  
					mOut.m[y][x] -= mOut.m[row][x] * times;
				}
			}

		}

		return true;
	}

	/*
	*	轉置
	*/

	void _MATH_LIB_EXPORT_ XMatrix_Transpos(XMatrix&m , XMatrix& mOut)
	{
		for(int r = 0 ;  r < 4 ; r ++)
		{
			mOut.m[0][r] = m.m[r][0];
			mOut.m[1][r] = m.m[r][1];
			mOut.m[2][r] = m.m[r][2];
			mOut.m[3][r] = m.m[r][3];
		}
		return;
	}

/*
 *	經過該投影矩陣投影后,投影體為一個范體,

	       x( -1 , 1 )
		   y( -1 , 1 )
		   z( -1 , 1 )

*/

	void	_MATH_LIB_EXPORT_ XM_Perspective(XMatrix& mOut,float fov_angle,float aspect,float Znear,float Zfar)
	{
		float dz = Zfar - Znear;
		
		float yp = XM_CosD(fov_angle / 2 ) / XM_SinD(fov_angle / 2 ) ;
	    float xp = yp / aspect;

		float z1 = - (Zfar + Znear) / dz;
		float z2 = - 2*Zfar *  Znear / dz ;

		mOut.m[0][0] = xp ; mOut.m[0][1] = 0  ; mOut.m[0][2] = 0  ; mOut.m[0][3] =  0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = yp ; mOut.m[1][2] = 0  ; mOut.m[1][3] =  0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = 0  ; mOut.m[2][2] = z1 ; mOut.m[2][3] = -1;
		mOut.m[3][0] = 0  ; mOut.m[3][1] = 0  ; mOut.m[3][2] = z2 ; mOut.m[3][3] =  0;

		return ;

	}

/*
 *	正交投影
    經過該投影矩陣后,物體大小不會變形.

	x  = x/w + dx;
	y  = y/h + dy;
	
	注意投影后的范體是(-1,1);
 */

	void	_MATH_LIB_EXPORT_ XM_Ortho3D(XMatrix& mOut,float Znear ,float Zfar ,float top,float bottom ,float left ,float right)
	{

		float cx = (right + left) / 2.0f ;
		float cy = (top   + bottom) / 2.0f ;
		float w = (float)fabs(right - left) / 2.0f ;
		float h = (float)fabs(top - bottom) / 2.0f ;

		float x = 1.0f/w;
		float dx = -cx/w;

		float y = 1.0f/h;
		float dy = -cy/h;

	    
		float z = -2.0f/(Zfar - Znear);
		float dz = -((Zfar + Znear)) / (Zfar - Znear);

		mOut.m[0][0] = x  ; mOut.m[0][1] = 0  ; mOut.m[0][2] = 0  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = y  ; mOut.m[1][2] = 0  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = 0  ; mOut.m[2][2] = z  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = dx ; mOut.m[3][1] = dy ; mOut.m[3][2] = dz ; mOut.m[3][3] = 1;


		return ;
	}

	void	_MATH_LIB_EXPORT_ XM_Transform(XMatrix& mOut,float tx,float ty,float tz)
	{
		mOut.m[0][0] = 1  ; mOut.m[0][1] = 0  ; mOut.m[0][2] = 0  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = 1  ; mOut.m[1][2] = 0  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = 0  ; mOut.m[2][2] = 1  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = tx ; mOut.m[3][1] = ty ; mOut.m[3][2] = tz ; mOut.m[3][3] = 1;
		return ;
	}
	void	_MATH_LIB_EXPORT_ XM_Scale(XMatrix& mOut,float sx,float sy,float sz)
	{
		mOut.m[0][0] = sx  ; mOut.m[0][1] = 0  ; mOut.m[0][2] = 0  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = sy  ; mOut.m[1][2] = 0  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = 0   ; mOut.m[2][2] = sz ; mOut.m[2][3] = 0;
		mOut.m[3][0] = 0  ; mOut.m[3][1] = 0   ; mOut.m[3][2] = 0  ; mOut.m[3][3] = 1;
		return ;
	}


	void	_MATH_LIB_EXPORT_ XM_RotateX(XMatrix& mOut,float angle)
	{
		float c = XM_CosD(angle);
		float s = XM_SinD(angle);
		mOut.m[0][0] = 1  ; mOut.m[0][1] = 0  ; mOut.m[0][2] = 0  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = c  ; mOut.m[1][2] = s  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = -s ; mOut.m[2][2] = c  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = 0  ; mOut.m[3][1] = 0  ; mOut.m[3][2] = 0  ; mOut.m[3][3] = 1;
		return ;
	}


	void	_MATH_LIB_EXPORT_ XM_RotateY(XMatrix& mOut,float angle)
	{
		float c = XM_CosD(angle);
		float s = XM_SinD(angle);
		mOut.m[0][0] = c  ; mOut.m[0][1] = 0  ; mOut.m[0][2] = -s  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = 0  ; mOut.m[1][1] = 1  ; mOut.m[1][2] =  0  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = s  ; mOut.m[2][1] = 0  ; mOut.m[2][2] =  c  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = 0  ; mOut.m[3][1] = 0  ; mOut.m[3][2] =  0  ; mOut.m[3][3] = 1;
		return ;
    }

	void	_MATH_LIB_EXPORT_ XM_RotateZ(XMatrix& mOut,float angle)
	{
		float c = XM_CosD(angle);
		float s = XM_SinD(angle);
		mOut.m[0][0] = c  ; mOut.m[0][1] = s  ; mOut.m[0][2] = 0  ; mOut.m[0][3] = 0;
		mOut.m[1][0] = -s ; mOut.m[1][1] = c  ; mOut.m[1][2] = 0  ; mOut.m[1][3] = 0;
		mOut.m[2][0] = 0  ; mOut.m[2][1] = 0  ; mOut.m[2][2] = 1  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = 0  ; mOut.m[3][1] = 0  ; mOut.m[3][2] = 0  ; mOut.m[3][3] = 1;
		return ;

	}


	/*******************************************************************************
	This function is tested by Stanly Lee at 2003-11

	*******************************************************************************/
	void _MATH_LIB_EXPORT_ XM_RotatePV(XMatrix& mOut,XVector& v , float angle)
	{
		float vsin = XM_SinD(angle);
		float vcos = XM_CosD(angle);

		float a = v.x * vsin;
		float b = v.y * vsin;
		float c = v.z * vsin;

		mOut.m[0][0] = vcos  ; mOut.m[0][1] = c     ; mOut.m[0][2] = -b    ; mOut.m[0][3] = 0;
		mOut.m[1][0] = -c    ; mOut.m[1][1] = vcos  ; mOut.m[1][2] = a     ; mOut.m[1][3] = 0;
		mOut.m[2][0] = b     ; mOut.m[2][1] = -a    ; mOut.m[2][2] = vcos  ; mOut.m[2][3] = 0;
		mOut.m[3][0] = 0     ; mOut.m[3][1] = 0     ; mOut.m[3][2] = 0     ; mOut.m[3][3] = 1;
		return ;
		
	}


	/*******************************************************************************
	This function is tested by Stanly Lee at 2003-11
	*******************************************************************************/
	void _MATH_LIB_EXPORT_ XM_Rotate(XMatrix& mOut,XVector& v , float angle)
	{
		//This code and algrithm is copy from the mesaLib4.0
		float xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c, s, c;


		float x = v.x;
		float y = v.y;
		float z = v.z;

		s = (float) XM_SinD( angle  );
		c = (float) XM_CosD( angle  );

		mOut.LoadIdentity();

#define M(row,col)  mOut.m [row ] [ col ]

			float mag = (float) sqrt(x * x + y * y + z * z);

			if (mag <= 1.0e-4) 
			{
				/* no rotation, leave mat as-is */
				return;
			}

			x /= mag;
			y /= mag;
			z /= mag;


			xx = x * x;		yy = y * y;
			zz = z * z;		xy = x * y;
			yz = y * z;		zx = z * x;
			xs = x * s;		ys = y * s;
			zs = z * s;		one_c = 1.0F - c;

			/* We already hold the identity-matrix so we can skip some statements */
			M(0,0) = (one_c * xx) + c;
			M(1,0) = (one_c * xy) - zs;
			M(2,0) = (one_c * zx) + ys;
		/*  M(3,0) = 0.0F; */

			M(0,1) = (one_c * xy) + zs;
			M(1,1) = (one_c * yy) + c;
			M(2,1) = (one_c * yz) - xs;
		/*  M(3,1) = 0.0F; */

			M(0,2) = (one_c * zx) - ys;
			M(1,2) = (one_c * yz) + xs;
			M(2,2) = (one_c * zz) + c;
		/*  M(3,2) = 0.0F; */

		/*
			M(0,3) = 0.0F;
			M(1,3) = 0.0F;
			M(2,3) = 0.0F;
			M(3,3) = 1.0F;
		*/
#undef M
 
	}



    /*******************************************************************************
		This function is tested by Stanly Lee at 2003-11
	*******************************************************************************/
	void	_MATH_LIB_EXPORT_ XM_LookAt(XMatrix& mOut,XVector& eyeAt,XVector eyeTarget,XVector& upDir)
	{
		XVector vZ =   eyeAt - eyeTarget;//注意這里是因為OpenGL用的you手系.默認的方向是向著Z的負方向.
		XVector vX =   upDir.cp(vZ);

		vX.normalize();
		vZ.normalize();
		XVector vY =   vZ.cp(vX);//重新計算向上的方向.我們可以保證vY也是個單位向量,就不需要再做單位化了。

		#define M(row,col)  mOut.m[row ] [ col ]

		M(0,0) = vX.x;
		M(1,0) = vX.y;
		M(2,0) = vX.z;
		M(3,0) = - vX.dp3(eyeAt) ; 


		M(0,1) =  vY.x;
		M(1,1) =  vY.y;
		M(2,1) =  vY.z;
		M(3,1) =  -vY.dp3(eyeAt) ; 

		M(0,2) =  vZ.x;
		M(1,2) =  vZ.y;
		M(2,2) =  vZ.z;
		M(3,2) =  -vZ.dp3(eyeAt) ; 

		M(0,3) = 0;
		M(1,3) = 0;
		M(2,3) = 0;
		M(3,3) = 1;
		#undef M


	}
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品午夜在线观看| 欧美日韩亚洲综合一区二区三区| 久久综合精品国产一区二区三区 | 亚洲最大的成人av| 色综合久久88色综合天天6| 亚洲欧美一区二区久久| 欧美亚洲动漫精品| 日本最新不卡在线| 精品美女一区二区三区| 国产99一区视频免费| 亚洲欧美视频在线观看| 在线观看国产一区二区| 肉肉av福利一精品导航| 久久久久青草大香线综合精品| 成人精品免费看| 亚洲第一主播视频| 久久综合九色综合欧美亚洲| 99久久免费精品高清特色大片| 一区免费观看视频| 欧美精选午夜久久久乱码6080| 国产综合色在线视频区| 亚洲视频在线一区| 69成人精品免费视频| 国产精品性做久久久久久| 亚洲视频综合在线| 日韩欧美中文一区| av激情成人网| 日韩**一区毛片| 国产精品蜜臀av| 91精品国产全国免费观看| 国产成人亚洲综合色影视| 亚洲愉拍自拍另类高清精品| 精品三级在线看| 99久久99久久久精品齐齐| 毛片不卡一区二区| 亚洲精品一二三区| 精品国产一区二区三区久久久蜜月 | 91成人在线精品| 国产一区二区网址| 伊人一区二区三区| 国产调教视频一区| 欧美三区在线观看| 成人国产亚洲欧美成人综合网 | 成人黄色免费短视频| 日日欢夜夜爽一区| 1024国产精品| 26uuu成人网一区二区三区| 色哟哟一区二区三区| 国内成人精品2018免费看| 亚洲一区在线观看免费| 欧美国产精品v| 日韩美女在线视频| 欧美色图片你懂的| 99国产精品99久久久久久| 久久99国产乱子伦精品免费| 亚洲国产欧美一区二区三区丁香婷| 久久久精品免费免费| 日韩欧美色电影| 欧美日韩国产大片| 欧日韩精品视频| 成人国产精品视频| 粗大黑人巨茎大战欧美成人| 理论电影国产精品| 日韩精品五月天| 一区二区在线观看免费视频播放| 国产清纯在线一区二区www| 欧美成人vps| 日韩午夜av一区| 欧美一区二区三区四区五区| 3d动漫精品啪啪1区2区免费| 欧美艳星brazzers| 欧美中文一区二区三区| 色先锋资源久久综合| 日本韩国视频一区二区| 色综合天天天天做夜夜夜夜做| 成人午夜在线免费| 国产69精品久久777的优势| 国产乱码精品一区二区三区忘忧草 | 天堂影院一区二区| 亚洲国产aⅴ天堂久久| 一区二区三区成人| 亚洲六月丁香色婷婷综合久久 | 麻豆一区二区99久久久久| 捆绑变态av一区二区三区| 蜜臀91精品一区二区三区| 日本亚洲三级在线| 激情成人综合网| 国产精品18久久久| av成人免费在线观看| 色欧美日韩亚洲| 欧美色偷偷大香| 日韩女优av电影| 国产亚洲综合性久久久影院| 中文字幕精品三区| 一区二区国产盗摄色噜噜| 亚洲成人动漫一区| 精品一区二区免费视频| 国产成人午夜高潮毛片| 不卡区在线中文字幕| 色综合一个色综合亚洲| 欧美色综合网站| 日韩欧美成人一区二区| 国产精品美日韩| 亚洲五月六月丁香激情| 麻豆国产欧美日韩综合精品二区 | 蜜桃av噜噜一区二区三区小说| 黄页视频在线91| 成人av网站在线观看免费| 日本韩国一区二区| 精品国产制服丝袜高跟| 亚洲欧美怡红院| 日本欧美一区二区三区乱码| 国产成人免费高清| 在线亚洲精品福利网址导航| 日韩欧美一二三四区| 国产精品欧美一级免费| 午夜日韩在线电影| 国产传媒久久文化传媒| 欧美性高清videossexo| 精品久久久久久最新网址| 亚洲少妇中出一区| 麻豆视频观看网址久久| 一本色道久久综合狠狠躁的推荐| 91精品黄色片免费大全| 国产精品国产三级国产| 日韩一区精品字幕| 91丨九色丨黑人外教| 日韩女优制服丝袜电影| 一区二区三区在线观看视频| 国产一区二区导航在线播放| 91国产丝袜在线播放| 久久久久99精品国产片| 亚洲午夜免费电影| 不卡一区二区中文字幕| 精品剧情在线观看| 性做久久久久久免费观看| 成人动漫一区二区三区| 日韩欧美一区二区久久婷婷| 亚洲国产欧美日韩另类综合| 成人高清免费在线播放| 亚洲精品在线一区二区| 午夜影视日本亚洲欧洲精品| 99久久99久久精品国产片果冻| 精品国产一区二区三区av性色| 亚洲成人免费av| 96av麻豆蜜桃一区二区| 久久久精品天堂| 免费在线看成人av| 欧美日韩黄色影视| 亚洲精品一二三| 成人av午夜影院| 国产农村妇女精品| 国产伦精品一区二区三区免费| 欧美剧在线免费观看网站| 亚洲一线二线三线视频| 91免费版pro下载短视频| 国产精品美女久久久久aⅴ| 国产一区二区免费在线| 日韩视频在线你懂得| 免费观看在线色综合| 欧美一区欧美二区| 日本成人在线电影网| 欧美三级日本三级少妇99| 樱桃视频在线观看一区| 日本丶国产丶欧美色综合| 国产精品久久久久久久久免费丝袜| 国产乱码精品一区二区三区五月婷| 精品精品欲导航| 精品一区二区综合| 亚洲精品一区二区三区在线观看| 毛片基地黄久久久久久天堂| 日韩欧美国产午夜精品| 激情av综合网| 欧美激情一区二区三区在线| 成人av在线看| 亚洲免费观看高清完整版在线观看 | 亚洲精选在线视频| 91黄视频在线| 亚洲在线视频一区| 欧美电影影音先锋| 日韩精品国产精品| 欧美v日韩v国产v| 国产真实乱子伦精品视频| 久久九九全国免费| 国产**成人网毛片九色| 成人免费小视频| 欧美在线免费观看视频| 日韩国产欧美三级| 精品国产一区a| av成人免费在线观看| 亚洲成人免费在线| 日韩精品资源二区在线| 高清beeg欧美| 亚洲综合男人的天堂| 欧美一级在线免费| 国产一区二区在线观看免费| 中文字幕在线不卡国产视频| 欧美日韩一区二区欧美激情| 六月丁香婷婷久久| **网站欧美大片在线观看|