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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xmatrixfunc.cpp

?? 類似于MatLab的東東,當(dāng)然肯定沒那么好,但基本的數(shù)學(xué)運(yùn)算還是有的
?? CPP
字號(hào):
/********************************************************************************
聲明:
  這里的代碼版權(quán)歸潘李亮所有.你可以自由使用分發(fā)這些代碼.但是不得用于商業(yè)用途.
  如有需要請(qǐng)于作者聯(lián)系.
   在你使用本代碼時(shí)候,請(qǐng)務(wù)必保留本聲明
    潘李亮 2003-10
	Stanly Lee. 2003-10

	Email : xheartblue@etang.com

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




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


#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; 
			}

			//消去當(dāng)前列,除了當(dāng)前行上的以外。該列全部成為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; 
			}

			//消去當(dāng)前列,除了當(dāng)前行上的以外。該列全部成為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;
	}

	/*
	*	轉(zhuǎn)置
	*/

	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;
	}

/*
 *	經(jīng)過該投影矩陣投影后,投影體為一個(gè)范體,

	       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 ;

	}

/*
 *	正交投影
    經(jīng)過該投影矩陣后,物體大小不會(huì)變形.

	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;//注意這里是因?yàn)镺penGL用的you手系.默認(rèn)的方向是向著Z的負(fù)方向.
		XVector vX =   upDir.cp(vZ);

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

		#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


	}
};

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲福利一二三区| 成人91在线观看| 在线播放亚洲一区| 日本成人在线一区| 日韩欧美久久久| 国产原创一区二区三区| 精品福利在线导航| 高潮精品一区videoshd| 国产精品少妇自拍| 色综合天天综合| 午夜欧美2019年伦理| 日韩美女在线视频| 国产成人午夜高潮毛片| 一色屋精品亚洲香蕉网站| 色综合视频在线观看| 国产精品美女久久久久aⅴ | 日韩一区欧美二区| 欧美日韩国产电影| 国产在线国偷精品免费看| 国产欧美一区二区在线观看| 99re免费视频精品全部| 亚洲一级在线观看| 精品少妇一区二区| 成人动漫精品一区二区| 一区二区三区日韩| 欧美大片在线观看| 成人av影院在线| 午夜电影网一区| 国产丝袜美腿一区二区三区| av在线一区二区三区| 日韩av中文在线观看| 国产日韩欧美一区二区三区乱码| 色哟哟日韩精品| 麻豆91精品视频| 亚洲精品福利视频网站| 欧美大度的电影原声| 成人aa视频在线观看| 免费观看在线综合色| 中文字幕中文字幕中文字幕亚洲无线 | av一区二区三区四区| 天堂蜜桃一区二区三区| 国产精品理论片| 日韩午夜在线播放| 9i在线看片成人免费| 久久国产精品色婷婷| 尤物在线观看一区| 国产午夜精品一区二区三区嫩草 | 国产 日韩 欧美大片| 亚洲成人1区2区| 久久国产三级精品| 亚洲自拍偷拍综合| 久久久欧美精品sm网站| 欧美三级日韩三级国产三级| 国产suv精品一区二区三区| 日本在线不卡视频一二三区| 最新国产精品久久精品| 久久综合九色欧美综合狠狠| 欧美妇女性影城| 91九色02白丝porn| jlzzjlzz亚洲日本少妇| 国产一区二区三区四| 老司机午夜精品| 首页国产欧美久久| 亚洲精品第一国产综合野| 国产精品美女www爽爽爽| 日韩三级高清在线| 678五月天丁香亚洲综合网| 色婷婷激情综合| 91丨porny丨在线| 99亚偷拍自图区亚洲| 国产精品91一区二区| 国产一区不卡在线| 免费日韩伦理电影| 日本三级韩国三级欧美三级| 亚洲一区二区高清| 久久色在线视频| 色噜噜久久综合| 91理论电影在线观看| 成人av在线一区二区三区| 国产成人av影院| 国产成人精品一区二| 国产一区二区三区精品视频| 国产在线播精品第三| 国产乱人伦精品一区二区在线观看| 另类人妖一区二区av| 久久er99热精品一区二区| 麻豆91在线播放免费| 日韩一本二本av| 欧美大胆一级视频| 国产亚洲精品资源在线26u| 国产亚洲一二三区| 国产精品毛片无遮挡高清| 亚洲欧洲中文日韩久久av乱码| 国产精品电影一区二区三区| 亚洲乱码中文字幕| 亚洲r级在线视频| 蜜臀91精品一区二区三区| 久草在线在线精品观看| 国产成人av一区二区| 不卡的av电影在线观看| 91久久国产综合久久| 正在播放亚洲一区| 久久综合精品国产一区二区三区| 26uuu久久天堂性欧美| 国产精品麻豆久久久| 亚洲综合丝袜美腿| 蜜臀av一级做a爰片久久| 国产精品亚洲综合一区在线观看| av电影一区二区| 欧美日韩精品欧美日韩精品一 | 一区二区三区中文字幕| 天天操天天干天天综合网| 久久av老司机精品网站导航| 成人伦理片在线| 欧美视频完全免费看| 久久久久国产一区二区三区四区| 国产精品成人一区二区三区夜夜夜| 亚洲五码中文字幕| 国产在线看一区| 色先锋aa成人| 2020国产精品久久精品美国| 一区二区三区在线视频播放| 麻豆免费看一区二区三区| 不卡的看片网站| 91精品午夜视频| 中文字幕亚洲精品在线观看| 婷婷综合五月天| 成人午夜视频福利| 777色狠狠一区二区三区| 亚洲国产成人私人影院tom| 首页欧美精品中文字幕| eeuss鲁片一区二区三区 | 性感美女极品91精品| 国产精品一区二区在线观看不卡| 一本久道久久综合中文字幕 | 欧美精品日韩综合在线| 国产精品久久久久桃色tv| 日本不卡123| 91成人在线观看喷潮| 国产欧美精品国产国产专区| 午夜免费久久看| 91在线云播放| 国产欧美在线观看一区| 蜜桃91丨九色丨蝌蚪91桃色| 欧洲另类一二三四区| 中文字幕av资源一区| 另类小说色综合网站| 欧美日韩国产区一| 亚洲精品国产a久久久久久| 处破女av一区二区| 亚洲精品一区二区三区影院| 日本中文字幕一区二区有限公司| 欧美亚日韩国产aⅴ精品中极品| 国产精品丝袜久久久久久app| 精品在线视频一区| 在线成人午夜影院| 亚洲精品日产精品乱码不卡| 成人国产视频在线观看| 久久久久久久久伊人| 另类小说欧美激情| 日韩午夜精品视频| 日韩精品色哟哟| 欧美日本乱大交xxxxx| 亚洲成a人片在线不卡一二三区| 成人av电影在线| 国产精品美女久久久久av爽李琼| 国产精品1区2区3区| 国产视频一区二区三区在线观看| 狠狠色丁香久久婷婷综合丁香| 91精品国产全国免费观看| 亚洲第一成人在线| 欧美精品免费视频| 日韩高清欧美激情| 欧美一级免费观看| 蜜桃精品在线观看| 2014亚洲片线观看视频免费| 国产一区999| 国产精品美女久久久久久 | 99久久99久久综合| 中文字幕制服丝袜一区二区三区 | 精品制服美女久久| 精品国产3级a| 粉嫩av亚洲一区二区图片| 国产日韩精品一区二区三区| 国产福利一区二区三区视频| 欧美激情在线免费观看| 成人av电影在线网| 亚洲精品美国一| 在线电影一区二区三区| 久久99精品视频| 国产亚洲精品bt天堂精选| www.欧美色图| 亚洲妇熟xx妇色黄| 精品日韩99亚洲| 国产91在线观看丝袜| 综合久久国产九一剧情麻豆| 欧美日韩电影一区| 麻豆国产91在线播放| 国产精品网友自拍| 欧美三级中文字幕在线观看|