从键盘读取一个3*3的矩阵键盘扫描程序,把它以及它的转置矩阵键盘扫描程序显示出来。急急急!!!!!!!

05-1502-1602-1602-1602-1602-1602-1602-1602-1602-16最新范文01-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-01后使用快捷导航没有帐号?
 论坛入口:
  |   |    |   | 
我要游戏程序
查看: 7851|回复: 18
问下公告板技术中使用转置矩阵的具体细节?
想了N久都没明白!哎
创建公告板世界矩阵的一个方法是从Direct3D获取当下的观察矩阵并把它转置,然后用这个矩定位,使其在任何时刻都朝向观察点,其实应该就是旋转.
但是不明白转置后的观察矩阵应该是怎样的?而且观察矩阵的数学表现方式是怎样?是如何具体实现的?查了很多资料都没查到.有知道的麻烦说下哈!非常非常感谢:)abc
D3DXMatrixTranspose(&matWorld, &matView);
& && &&&matWorld._41 = 10.0f;
& && &&&matWorld._42 = 0.0f;
& && &&&matWorld._43 = 10.0f;
g_pD3DDevice-&SetTransform(D3DTS_WORLD, &matWorld);
Re:问下公告板技术中使用转置矩阵的具体细节?
View Matrix 是由一个3*3 的旋转矩阵和一个位移向量组成,旋转矩阵可以由视点方向(Direction),向上向量(Up),右向量(Right)组成,也就是观察坐标系的3个坐标轴 x、y、z,在D3D中由于采用左手规则,所以旋转矩阵为
[ rx, ux, dx ]
[ ry, uy, dy ]
[ rz, uz,&&dz ]
位移向量则是相机的位移取反。由以上特性得知,View Matrix 的 Transpose 实际上就是反向旋转,由于 billborad 要面向相机,它的旋转正是相机旋转角度取负,也就是 view 旋转矩阵的 Transpose。
Re:问下公告板技术中使用转置矩阵的具体细节?
实在没看明白,汗!能不能给出4*4的矩阵,试着推理下或者会明白.
这个右向量(Right)不太理解,观察矩阵
D3DXMATRIX *D3DXMatrixLookAtLH(
 D3DXMATRIX *pOut,
& & CONST D3DXVECTOR3 *pEye,
& & CONST D3DXVECTOR3 *pAt,
& & CONST D3DXVECTOR3 *pUp
中并没有右向量呀.
Re:问下公告板技术中使用转置矩阵的具体细节?
右向量那玩意儿,一叉不就出来了么
FF年代,因为固定WorldViewProjection Matrix,想要billboard就必须将camera产生的view再转回去
Programable年代,假设模型输出时是正面,如果没有俯视情况,忽略掉view matrix就可以达到效果
Re:问下公告板技术中使用转置矩阵的具体细节?
其实没必要了解具体矩阵是如何实现的,反正我们获得了矩阵的指针,并使用相应函数实现功能就好了吧.呼,既然楼主你一定要4*4矩阵旋转前后比较的话,我说些吧.
恩,从基本的来说,我们实现一个矩阵的平移的话,可以将源矩阵乘以一个1*4的行向量,获得新的矩阵,我下面举例
一个4*4的单位矩阵乘以一个P(x,y,z,1)的行向量,则表示此矩阵向x轴移动了x的单位,向Y轴移动了y个单位,向Z轴移动了z个单位,最后获得移动后的目标矩阵是
[ 1, 0, 0, 0 ]
[ 0, 1, 0, 0 ]
[ 0, 0, 1, 0 ]
[ x, y,&&z, 1 ]
从中可以看出4*4矩阵N中的N41,N42,N43分别控制其在x轴y轴z轴上的平移单位.
2:绕z轴旋转
同理,我们将一个单位矩阵绕Z轴沿顺时针方向进行旋转A角度.则获得目标矩阵是
[ 1,& & 0,& &&&0,& & 0 ]
[ 0, CosA, SinA,&&0 ]
[ 0, -SinA, CosA, 0]
[ 0,& & 0,& && &0,& &1 ]
从中可见N22,N23,N32,N33是控制矩阵围绕X轴旋转角度的
3:饶X轴正向旋转B获得目标矩阵为
[ CosB, 0, -SinB,&&0 ]
[ 0,& & 1,& &&&0,& & 0 ]
[ SinB, 0, CosB, 0]
[ 0,& & 0,& && &0,& &1 ]
从中可见N11,N13,N31,N33是控制矩阵围绕X轴旋转角度的
4:绕Y轴旋转C获得目标矩阵为
[ CosC, SinC, 0 , 0]
[ -SinC, CosC, 0 ,&&0 ]
[ 0,& & 0,& &&&1,& & 0 ]
[ 0,& & 0,& && &0,& &1 ]
从中可见N11,N12,N21,N22是控制矩阵围绕Y轴旋转角度的
我们将一单位矩阵沿X轴缩放X倍,Y轴缩放Y倍,Z轴缩放Z倍,则获得目标矩阵如下
[ x, 0, 0, 0 ]
[ 0, y, 0, 0 ]
[ 0, 0, z, 0 ]
[ 0, 0, 0, 1]
可见N11,N22,N33控制着缩放.
从这里可以推算出你变换过后的矩阵.
呼,打字真累,也不知道有用没.&_&
Re:问下公告板技术中使用转置矩阵的具体细节?
非常感谢谢谢楼上的!不过变换矩阵我都了解了,汗.看到公告板的世界矩阵可以用观察矩阵转置来实现觉的希奇,转置矩阵就是行列互换嘛,没看出什么关联性.所以非常想推导下数学实现过程,但不知道4*4的观察矩阵的数学表示方法是怎样的?!哎,确实是非常强烈的想知道呀!
Re:问下公告板技术中使用转置矩阵的具体细节?
哦.观察矩阵的内容啊,我也不懂,呵呵,不好意思,见笑了T T
Re:问下公告板技术中使用转置矩阵的具体细节?
呵呵,客气.看来我们都的等人来盖楼了哈.其实当时该把标题设置成"请问观察矩阵用数学怎么表示"就很省事了,HOHO.
Re:问下公告板技术中使用转置矩阵的具体细节?
观察矩阵的旋转部分是一个正交矩阵,它的转置矩阵等于它的逆矩阵。
Re:问下公告板技术中使用转置矩阵的具体细节?
发现5楼的把X轴的当作Z轴的了,把Y轴的当作X轴的了,把Z的当Y的了...C语言输入N*N的矩阵,输出它的转置矩阵.矩阵的转置操作,即把矩阵的行元素变为列元素,_百度知道
C语言输入N*N的矩阵,输出它的转置矩阵.矩阵的转置操作,即把矩阵的行元素变为列元素,
我有更好的答案
#include&stdio.h&#include&math.h&void main(){
int a[100][100];int n,i,j,t;printf(&--------&);
scanf(&%d&,&n);
printf(&--------&);
for(i=0;i&n;i++)for(j=0;j&n;j++){
scanf(&%d&,&a[i][j]);}for(i=0;i&n;i++){ for(j=0;j&n;j++) { printf(&%4d&,a[i][j]); } printf(&\n&);}for(i=0;i&n;i++)for(j=0;j&n;j++){ t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t;}for(i=0;i&n;i++){ for(j=0;j&n;j++)
printf(&%4d&,a[i][j]);
}printf(&\n&);}}
你的不行错了
采纳率:20%
#include &stdio.h&void main(){
printf(&输入矩阵大小n:\n&);
scanf(&%d&, &n);
int *a = new int[n*n];
int *t = new int[n*n];
printf(&输入矩阵元素:\n&);
for(int i=0;i&n;i++)
for(int j=0;j&n;j++)
scanf(&%d&, a+i*n+j);
for(i=0;i&n;i++)
//将数组a中的列元素分别赋值给数组t中的行元素
for(int j=0;j&n;j++)
*(t+i*n+j) = *(a+j*n+i);
for(i=0;i&n*n;i++)
//更新数组a中的数据
*(a+i) = *(t+i);
for(i=0;i&n;i++)
//打印数组元素
for(int j=0;j&n;j++)
printf(&%d
&, *(a+i*n+j));
printf(&\n&);
老师我交上去系统说编译错误怎么改啊
什么错误信息
加我Q吧我跟你说详细就是我们学校的平台上的代码要求相当严格你的这个代码过不了
本回答被网友采纳
用双层循环,把a[ j ][ i ] = a[ i ][ j ]就好啦。
求完整代码谢谢来不及了
看你这么急, ,这有一个人家编的。
QQ我,详谈。
4条折叠回答
为您推荐:
其他类似问题
您可能关注的内容
转置矩阵的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。由键盘输入一个3*4的矩阵,要求输出它的转置矩阵_百度知道
由键盘输入一个3*4的矩阵,要求输出它的转置矩阵
由键盘输入一个3*4的矩阵,要求输出它的转置矩阵C语言,各位大哥求救啊
我有更好的答案
#include &iostream&void main(){int a[3][4];for (int i=0;i&3;i++)for (int j=0;j&4;j++){cout&&&输入a[&&&i&&&][&&&j&&&]:&;cin&&a[i][j];}cout&&&矩阵为:&&&for (int i=0;i&3;i++){for (int j=0;j&4;j++) { cout&&&输出a[&&&i&&&][&&&j&&&]:&&&a[i][j]&&& &; }cout&&}cout&&&转置矩阵为:&&&for (int j=0;j&4;j++){for (int i=0;i&3;i++) { cout&&&输出a[&&&i&&&][&&&j&&&]:&&&a[j][i]&&& &; }cout&&}system(&pause&);}//试一下看看行不?//不行再来问我,(*^__^*) 嘻嘻……
采纳率:26%
方法很多,最简单的用镶嵌For Next循环,转置的话循环中的step为-1即可!
为您推荐:
其他类似问题
您可能关注的内容
转置矩阵的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 3616935
博文数量: 1854
博客积分: 10870
博客等级: 上将
技术积分: 19782
注册时间:
分类: C/C++ 22:33:42
几天同事问我一个问题:矩阵的在位转置或者是原地转置(transpose inplace),意思就是尽量不分配额外的内存空间,把一个矩阵转置。 矩
阵的存储结构是用一块线性内存来存储数据,然后记录宽度、高度,大致如下class Matrix { double*
int width, };【问题分析】因为没有额外空间可用,所以改变数据只能通过
“交换”,也就是把矩阵中的两个元素交换位置,这个操作可以不使用任何额外存储空间。那么通过交换操作,可以衍生出来的更复杂的操作就是循环移位,大致意
思就是一组数据向左或者向右移动一个位置,比如原来是{ x a1 a2 a3 ... an y },那么左移位后就是 { a1 a2
... an y x },显然通过连续的数据交换是可以实现这个操作的。那么我们的算法中可以使用的数据移动操作就只有这两种:swap(i,
j)完成数据交换,move_data(src, dst)完成{src,
dst}之间的数据循环移位。(要说明的是,显然数据循环移位操作,不仅仅局限于连续的数据)矩阵转置,实质上是对存储索引的重新排列
(permutation),和排序有点类似,但不一样的是,排序是值排序,算法决定一个数据元素的最终位置的时候只要知道这个数据的数值就可以了,但是
转置是对索引位置的排序,我们不关心数据值的大小,只关心它在源序列中的位置,而如果不用额外存储空间,这个信息是很难保存的。比如对于
一个3*4的矩阵 1&&2&&3&&4 5&&6&&7&&8 9 10 11 12转置后为: 1
5&&9 2 6 10 3 7 11 4 8 12观察在内存中的存储形式,源矩阵是S = { 1 2 3 4 5
6 7 8 9 10 11 12 }目标矩阵是D = { 1 5 9 2 6 10 3 7 11 4 8 12 }转
置问题就是对于S,求出D即可。S是先验可知的,只是和矩阵的宽度高度有关,D是S的一个置换。【正推】比较容易想到的
思路就是对S中的每个元素S[i],求出它在D中的位置j1,我们把S[j1]先保存一下,然后再看S[j1]应该在D中的位置,比如是j2,那么再看
S[j2]应该被放到的位置j3,这样继续下去,就得到了一个子序列 { i, j1, j2, ... i
},最后一个一定是i,也就是说这个子序列最后必然要回到i,很容易想到啊,最后总有一个数据要填充到第一个数据的位置上,因为就这么些个数据,不可能出
来一个洞洞啊,呵呵。我们把这个子序列称为T(i)那么对这样一个子序列完成一个move_data操作之后,这些位置上的数据就安放好
了,然后我们再寻找下一个子序列,从i+1开始,循环下去,直到所有的数据都放好了,就收工了。这个算法的一个问题就是当我完成一个子序
列T(i)后,如果i+1包含在T(i)中,那么T(i+1)和T(i)是一样的,必须要跳过i+1,看i+2,如果i+2也在T(i)中,那就继续跳
过,所以我需要一个标志数组来标志整个序列中那些位置的数据是已经放好的了,那些数据是还没有放好的,我只要对那些没有放好的数据做move_data。
那么这个额外的标志数组的大小和矩阵是一样大的,呵呵额外存储空间啊,不行,所以这个方法失败。不用标志数组也可以,我可以事先先把整个
序列划分成若干个互不重叠的子序列,然后再进行操作,但是划分结果保存在那里呢?呵呵,所以,这个方法还是不行。【反推】换
个思路,也许就好了。如果我们从目标矩阵开始呢,我们考虑D中的一个位置i,这个i应该由S中的S[j]来填充,那么我们直接把
S[i..j]之间做一个循环移位,这样i位置就被正确的设置了,同时[i+1,j]之间的数据仍然是按原来在S中的顺序。如果我们考虑把i从第一个位置
开始依次循环递加,那么每次操作之后,我都可以保证[1, i]之间是放好的,[i,
n]之间是没有放好的,呵呵看出来好处了么?我们不再需要任何额外的存储空间来保存哪些数据是已经放好的了。虽然原理是很容易,但是写出
程序还是要费一点心思,关键是在于对于[i,
n]之间的这些待放置数据,它们之间的相对顺序虽然没有乱,但是位置都变动了,所以你要能够一直跟踪这些位置变动信息。这个比看上去的要复杂一点。最
后的程序如下 void TransposeInplace(){&&&&int from, to, offset,
&&&&int i,&&&&for (i = to = offset = 0, step = i
< ++i, --step, offset += height-1) {&&&&&&&&for (j = 0,
from = i + j < ++j, ++to, from += step) {&&&&&&&&&&&&_move_data(from,
to);&&&&&&&&}&&&&}&&&&swap(width, height);}显然,如果以
move_data为单元操作,这个算法的复杂度是O(n)的,考虑到move_data本身也是O(n)的,那么这个算法的复杂度是O(n^2)【再
快一点】能不能更快一些呢?呵呵算法上的加速不是很容易了,但是技巧上的加速还是可以的。move_data
是O(n)的,但是swap就是O(1)的了,上面的算法中对于每一个数据都要通过move_data来进行放置,所以我想到的一个加速就是尽可能的用
swap来取代move_data假设m = min(width, height),矩阵左上角的,大小为m×m
的方阵显然是可以通过交换来完成转置的,如果我们先用swap对这个小的子方阵做好转置,再对剩下的数据放置,也许就可以快一些了。比
如,对前面用过的那个3*4的矩阵 1&&2&&3&&4 5&&6&&7&&8 9 10 11 12首先变化成
1 5&&9&&4 2 6 10&&8 3 7 11
12也就是左边的3*3的小方阵转置一下,右边的部分不动,这样变换后,子序列{ 1, 5, 9, 2, 6, 10, 3, 7, 11
}有序,相对位置不需要变动了,剩下的工作只是把子序列 {4, 8, 12} 移到矩阵末尾去。呵呵,这个要快很多吧。再仔细推敲这个
算法,可以写出程序来,这个程序的编写仍然是以跟踪数据索引的位置变动为难点。比第一个要稍微困难一点,但是也不致于写不出来。程序如下void
TransposeInplaceQuick(){&&&&int m = width < height ? width :
&&&&int i,&&&&for (i = 0; i < ++i) {&&&&&&&&for
(j = i+1; j < ++j) {&&&&&&&&&&&&int i_old = _index(j, i);&&&&&&&&&&&&int
i_new = _index(i, j);&&&&&&&&&&&&swap(data[i_old], data[i_new]);&&&&&&&&}&&&&}&&&&if
(m == width) {&&&&&&&&for (i = i < ++i) {&&&&&&&&&&&&for
(j = 0; j < ++j) {&&&&&&&&&&&&&&&&_move_data(_index(j,
i), j * (width + i - m + 1) + i);&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&else
{&&&&&&&&int last = _index(width-1, height-1);&&&&&&&&int n =
0; &&&&&&&&for (j = width - 1; j >= --j) {&&&&&&&&&&&&int
step =&&&&&&&&&&&&for (i = height - 1; i >= 0; --i, --last) {&&&&&&&&&&&&&&&&_move_data(_index(j,
i) - step, last);&&&&&&&&&&&&&&&&step -= (width - 1 - j);&&&&&&&&&&&&}&&&&&&&&&&&&n
+= height - 1;&&&&&&&&}&&&&}&&&&swap(width, height);}这个
算法的时间复杂度仍然是O(n^2)的,但是要比第一个快一些。平均看来时间应该是前一个算法的一半。
阅读(670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 矩阵键盘原理 的文章

更多推荐

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

点击添加站长微信