向量单位向量化

【数据库连接失败:】[Microsoft][ODBC SQL Server Driver][SQL Server]无法打开登录所请求的数据库 "SY_Dbases"。登录失败。typedef&struct&_D3DVECTOR&{&&&&float&x;&&&&float&y;&&&&float&z;}&D3DVECTOR;typedef&struct&D3DXVECTOR3&:&public&D3DVECTOR{public:&&&&D3DXVECTOR3()&{};&&&&D3DXVECTOR3(&CONST&FLOAT&*&);&&&&D3DXVECTOR3(&CONST&D3DVECTOR&&);&&&&D3DXVECTOR3(&CONST&D3DXFLOAT16&*&);&&&&D3DXVECTOR3(&FLOAT&x,&FLOAT&y,&FLOAT&z&);&&&&//&casting&&&&operator&FLOAT*&();&&&&operator&CONST&FLOAT*&()&const;&&&&//&assignment&operators&&&&D3DXVECTOR3&&operator&+=&(&CONST&D3DXVECTOR3&&);&&&&D3DXVECTOR3&&operator&-=&(&CONST&D3DXVECTOR3&&);&&&&D3DXVECTOR3&&operator&*=&(&FLOAT&);&&&&D3DXVECTOR3&&operator&/=&(&FLOAT&);&&&&//&unary&operators&&&&D3DXVECTOR3&operator&+&()&const;&&&&D3DXVECTOR3&operator&-&()&const;&&&&//&binary&operators&&&&D3DXVECTOR3&operator&+&(&CONST&D3DXVECTOR3&&)&const;&&&&D3DXVECTOR3&operator&-&(&CONST&D3DXVECTOR3&&)&const;&&&&D3DXVECTOR3&operator&*&(&FLOAT&)&const;&&&&D3DXVECTOR3&operator&/&(&FLOAT&)&const;&&&&friend&D3DXVECTOR3&operator&*&(&FLOAT,&CONST&struct&D3DXVECTOR3&&);&&&&BOOL&operator&==&(&CONST&D3DXVECTOR3&&)&const;&&&&BOOL&operator&!=&(&CONST&D3DXVECTOR3&&)&const;}&D3DXVECTOR3,&*LPD3DXVECTOR3;
以下整理出DirextX 9的一些向量函数,由于本人也只是初学DirectX 9,所以文章中可能蕴含着一些错误,也可能不完整,敬请指出,以后会陆续补充。要正确运行以下的示例程序,需要在工程中包含d3dx9.lib,或者在main函数前加入#pragma comment(lib, "d3dx9.lib")以指示编译器链接d3dx9.lib。 向量相加: 重载的运算符 +向量相减: 重载的运算符-函数原型: D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& )D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& )代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&//&calculate&for&2&dimension&vector&&&&&D3DXVECTOR2&A2(6.0,&3.0);&&&&D3DXVECTOR2&B2(4.0,&2.0);&&&&D3DXVECTOR2&C2&=&A2&+&B2;&&&&&&&&printf("\nC2&=&(%.2f,&%.2f)&+&(%.2f,&%.2f)&=&(%.2f,&%.2f)\n",&A2.x,&A2.y,&B2.x,&B2.y,&C2.x,&C2.y);&&&&//&calculate&for&3&dimension&vector&&&&D3DXVECTOR3&A3(5.0,&2.6,&10);&&&&D3DXVECTOR3&B3(2.0,&3.4,&3.0);&&&&D3DXVECTOR3&C3&=&A3&+&B3;&&&&printf("\nC3&=&(%.2f,&%.2f,&%.2f)&+&(%.2f,&%.2f,&%.2f)&=&(%.2f,&%.2f,&%.2f)\n",&&&&&&&&&A3.x,&A3.y,&A3.z,&B3.x,&B3.y,&B3.z,&C3.x,&C3.y,&C3.z);&&&&D3DXVECTOR3&D3&=&A3&-&B3;&&&&printf("\nD3&=&(%.2f,&%.2f,&%.2f)&-&(%.2f,&%.2f,&%.2f)&=&(%.2f,&%.2f,&%.2f)\n",&&&&&&&&&A3.x,&A3.y,&A3.z,&B3.x,&B3.y,&B3.z,&D3.x,&D3.y,&D3.z);&&&&return&0;}
输出:C2 = (6.00, 3.00) + (4.00, 2.00) = (10.00, 5.00)C3 = (5.00, 2.60, 10.00) + (2.00, 3.40, 3.00) = (7.00, 6.00, 13.00)D3 = (5.00, 2.60, 10.00) - (2.00, 3.40, 3.00) = (3.00, -0.80, 7.00)向量的标量乘法: 重载的运算符 *函数原型:friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& );代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&//&calculate&for&2&dimension&multiply&&&&D3DXVECTOR2&A(6.0,&3.0);&&&&float&m&=&5.0;&&&&D3DXVECTOR2&B&=&m&*&A;&&&&printf("\nB&=&%.2f&*&(%.2f,&%.2f)&=&(%.2f,&%.2f)\n",&m,&A.x,&A.y,&B.x,&B.y);&&&&//&calculate&for&3&dimension&multiply&&&&D3DXVECTOR3&C(1.0,&2.0,&3.0);&&&&D3DXVECTOR3&D&=&m&*&C;&&&&printf("\nD&=&%.2f&*&(%.2f,&%.2f,&%.2f)&=&(%.2f,&%.2f,&%.2f)\n\n",&&&&&&&&&m,&C.x,&C.y,&C.z,&D.x,&D.y,&D.z);&&&&return&0;}
输出:B = 5.00 * (6.00, 3.00) = (30.00, 15.00)D = 5.00 * (1.00, 2.00, 3.00) = (5.00, 10.00, 15.00)向量长度的计算: D3DXVec3Length函数原型: FLOAT D3DXVec3Length& ( CONST D3DXVECTOR3 *pV );代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&//&calculate&vector&length&for&2&dimension&&&&D3DXVECTOR2&A(3.0,&5.0);&&&&float&A_len&=&D3DXVec2Length(&A);&&&&printf("\nvector&A(%.2f,&%.2f)&length&=&%f\n",&A.x,&A.y,&A_len);&&&&//&calculate&vector&length&for&3&dimension&&&&D3DXVECTOR3&B(23.0,&3.8,&-12.3);&&&&float&B_len&=&D3DXVec3Length(&B);&&&&printf("\nvector&B(%.2f,&%.2f,&%.2f)&length&=&%f\n",&B.x,&B.y,&B.z,&B_len);&&&&return&0;}
输出:vector A(3.00, 5.00) length = 5.830952vector B(23.00, 3.80, -12.30) length = 26.357731向量的单位化: D3DXVec2Normalize, D3DXVec3Normalize函数原型:D3DXVECTOR2* WINAPI D3DXVec2Normalize( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV );D3DXVECTOR3* WINAPI D3DXVec3Normalize( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV );代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&//&vector&normalize&for&2D&dimension&&&&D3DXVECTOR2&A(3.0,&6.0);&&&&D3DXVECTOR2&A_&&&&D3DXVec2Normalize(&A_normal,&&A);&&&&printf("vector&A(%.2f,&%.2f)&normal&=&(%f,&%f)\n\n",&A.x,&A.y,&A_normal.x,&A_normal.y);&&&&//&vector&normalize&for&3D&dimension&&&&D3DXVECTOR3&B(2.5,&10.0,&8.0);&&&&D3DXVECTOR3&B_&&&&D3DXVec3Normalize(&B_normal,&&B);&&&&printf("vector&B(%.2f,&%.2f,&%.2f)&normal&=&(%f,&%f,&%f)\n\n",&B.x,&B.y,&B.z,&B_normal.x,&B_normal.y,&B_normal.z);&&&&&&&&return&0;}
输出:vector A(3.00, 6.00) normal = (0..894427)vector B(2.50, 10.00, 8.00) normal = (0...613121)向量的点积: D3DXVec3Dot函数原型: FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 );代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&D3DXVECTOR3&u(2.0,&3.0,&4.0);&&&&D3DXVECTOR3&v(11.0,&5.0,&7.0);&&&&float&dot_value&=&D3DXVec3Dot(&u,&&v);&&&&if(dot_value&&&0)&&&&&&&&printf("The&angle&between&u&and&v&is&&&90");&&&&else&if(dot_value&==&0)&&&&&&&&printf("The&angle&between&u&and&v&is&=&90");&&&&else&&&&&&&&printf("The&angle&between&u&and&v&is&&&90");&&&&printf("\n\n");&&&&return&0;}
输出:The angle between u and v is & 90向量的叉积:D3DXVec3Cross函数原型:&D3DXVECTOR3* D3DXVec3Cross&&& ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 );代码示例:
#include&&stdio.h&#include&&D3DX9Math.h&#pragma&warning(disable&:&4305)int&main(){&&&&D3DXVECTOR3&i(1.0,&0.0,&0.0);&&&&D3DXVECTOR3&j(0.0,&1.0,&0.0);&&&&D3DXVECTOR3&k(0.0,&0.0,&1.0);&&&&D3DXVECTOR3&cross_&&&&D3DXVec3Cross(&cross_vector,&&i,&&j);&&&&printf("ixj&=&(%f,&%f,&%f)\n\n",&cross_vector.x,&cross_vector.y,&cross_vector.z);&&&&D3DXVec3Cross(&cross_vector,&&j,&&k);&&&&printf("jxk&=&(%f,&%f,&%f)\n\n",&cross_vector.x,&cross_vector.y,&cross_vector.z);&&&&D3DXVec3Cross(&cross_vector,&&k,&&i);&&&&printf("kxi&=&(%f,&%f,&%f)\n\n",&cross_vector.x,&cross_vector.y,&cross_vector.z);&&&&return&0;}
输出:ixj = (0...000000)jxk = (1...000000)kxi = (0...000000)
随笔 - 1361
评论 - 515
随笔分类(178)
3D游戏编程相关链接
OpenGL GPU编程
3D图形学,游戏编程。您还未登陆,请登录后操作!
悬赏20爱心点
分享到微博
为什么要单位化?
答案的前面部分我抠掉了,求出了a=2,A的特征值为1,2,5.特征向量分别为a1,a2,a3.那么直接令Q=(a1,a2,a3),那么直接就Q^-1AQ=对角阵啊?为什么还要把特征向量分别单位化呢?单位化到底是什么意思....
你的问题也许从几何方面解释会比较清楚。一般情形求出的是仿射坐标系,对于实对称阵可以要求找到直角坐标系。具体地:
取定3维欧氏空间V=R^3的一个基,则任一3级方阵A就对应V上的一个线性变换。若取V的另一个基,则这个线性变换在新基下的矩阵B与A就是相似的,即B=Q^{-1}AQ,其中Q是从原来的基到新基的过渡矩阵。你的问题中,A有3个不同的特征值,相当于要找3个特征向量(属于不同特征值的特征向量是线性无关的)做新基,求得的Q就能把A对角化。这对任意矩阵都成立,几何上相当于换了一个仿射基底--不要求基向量之间正交、也不要求它们是单位向量。
当A是实对称矩阵时,可以进一步要求新基构成直角坐标系,即3个基向量互相正交,且均为单位向量。由于在欧氏空间里,属于不同特征值的特征向量不仅线性无关,而且还是正交的,所以你求出的a1,a2,a3已经两两正交的,进一步单位化后,就构成一个新的直角坐标系了。线性代数中通常把这样的基称作“标准正交基”。换言之,对于实对称阵A,可以要求找一个标准正交基,使A在这个基下的矩阵成对角形。如果A的特征值不是互不相同的,那么对属于同一个特征值的不同特征向量还要
你的问题也许从几何方面解释会比较清楚。一般情形求出的是仿射坐标系,对于实对称阵可以要求找到直角坐标系。具体地:
取定3维欧氏空间V=R^3的一个基,则任一3级方阵A就对应V上的一个线性变换。若取V的另一个基,则这个线性变换在新基下的矩阵B与A就是相似的,即B=Q^{-1}AQ,其中Q是从原来的基到新基的过渡矩阵。你的问题中,A有3个不同的特征值,相当于要找3个特征向量(属于不同特征值的特征向量是线性无关的)做新基,求得的Q就能把A对角化。这对任意矩阵都成立,几何上相当于换了一个仿射基底--不要求基向量之间正交、也不要求它们是单位向量。
当A是实对称矩阵时,可以进一步要求新基构成直角坐标系,即3个基向量互相正交,且均为单位向量。由于在欧氏空间里,属于不同特征值的特征向量不仅线性无关,而且还是正交的,所以你求出的a1,a2,a3已经两两正交的,进一步单位化后,就构成一个新的直角坐标系了。线性代数中通常把这样的基称作“标准正交基”。换言之,对于实对称阵A,可以要求找一个标准正交基,使A在这个基下的矩阵成对角形。如果A的特征值不是互不相同的,那么对属于同一个特征值的不同特征向量还要用施密特正交化过程将它们正交化,然后再单位化。
顺便说一句,这样最后得到的Q实际上是一个正交阵,满足Q^{-1}=Q'。所以这时A不仅相似于一个对角阵,并且也合同于对角阵。
回答数:500
那为什么任意矩阵相似对角化的时候,不需要把特征向量单位化呢?
你这回答太专业了....我只是个数学小白...
您的举报已经提交成功,我们将尽快处理,谢谢!1已知试把向量组正交化并单位化_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
1已知试把向量组正交化并单位化|1​已​知​试​把​向​量​组​正​交​化​并​单​位​化
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢unity3d 单位化向量有什么作用?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:17,116贴子:
unity3d 单位化向量有什么作用?收藏
unity3d 单位化向量有什么作用?
对于差值比较好
比如你向前走路速度1,向右速度1,那么总和就是sqrt 2,加起来单位化一下,适用于键盘摇杆等控制行走时使用。
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
使用签名档&&
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 向量标准化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信