有这样的一个问题.一个四维坐标(x,y,z,1)是隐含的,也就是说你不可以直接获得它的值,但是可以结合其他矩阵使用,以得到一个组合后的矩阵,当然了,这个组合后的矩阵得值也是不可知的.在这里你仅仅知道的是你所想要得结果形式,也就是说:假设当前有一个点为(x,y,z,1)(你并不知道他的值是多少,只有计算机知道,但是有一点就是,你也不必知道其计算结果,你只是想改变其状态)
 
如果像将改坐标绕着Y轴作旋转,那么你只需知道这样一个矩阵与它相乘就行了
{cosA ,0,-sinA,0
  0   ,1,  0  ,0
  sinA,0,cosA ,0
  0   ,0 ,   0, 1

 
也就是说起计算模式如下:
(x,y,z,1)*| cosA ,  0,  -sinA, 0  |
          | 0   ,   1,  0    , 0  |=想要的状态(x',y',z',1)
          | sinA,   0, cosA  , 0  |
          |  0   ,  0 ,   0  , 1  |在这里面,我们并不关心(x,y,z,1),我们只要知道该旋转矩阵就行了.
            
 
现在我的问题如下:
(x,y,z,1)*矩阵X=我想要点的转换状态(x',y',z',1)其中我想要点的“转换状态“如下:
x'=(x*cosA)/(x*sinA+z*cosA)
y'=y/Z
z'=(z*sinA)/(x*sinA+z*cosA)我不知道怎么倒推出那个“矩阵X“啊,大家看看能不能推出来。

解决方案 »

  1.   

    设A=(x,y,z,1)
      B=(x',y',z',1)
    设变换矩阵为X
    将A扩展成方阵记为Aex
    将B扩展成方阵记为Bex
    则Aex*X=Bex
    对Aex求逆极为Aexr
    左右两边左乘Aexr
    Aex*X=Bex
    =>Aexr*Aex*X=Aexr*Bex
    =>E*X=Aexr*Bex
    =>X=Aexr*Bex
    看!变换矩阵出来了!
      

  2.   

    sboom(+-LingCh-+)(爱美人不爱VC) :实在不好意思,现在有两个问题摆在我的面前,
    1:   x'=(x*cosA)/(x*sinA+z*cosA)
          y'=y/Z
          z'=(z*sinA)/(x*sinA+z*cosA)
    的扩展矩阵是什么呢?我没扩展开来啊?能不能帮帮忙啊?
    2:(x,y,z,1)是可用的但是不可得到的,也就是说这个原始的值是隐含的,现在只提供给你一个函数接口,比如void Xroat(float *变换矩阵存储数组),在这里你只能写*变换矩阵存储数组,那么结果你也不可得到,但是可以预测到,这跟你的矩阵有关系。比如说你想让(x,y,z,1)这样的点进行绕着y周旋转那么该矩阵,你只要写成:
    //------------------------------
    {cosA ,0,-sinA,0
      0   ,1,  0  ,0
      sinA,0,cosA ,0
      0   ,0 ,   0, 1

    //------------------------------
    存储到数组中,调用那个函数就行了,其他信息的一概不知。基于以上的两点,不知道
     x'=(x*cosA)/(x*sinA+z*cosA)
          y'=y/Z
          z'=(z*sinA)/(x*sinA+z*cosA)
    是由什么矩阵计算得来呢?有一个前提就是,这个矩阵肯定不含有未知数x,y,z,仅仅是一些数值。sboom(+-LingCh-+)(爱美人不爱VC)帮帮忙了,我真的傻了!!
      

  3.   

    我不知道你的x',y',z'是如何得出的,我就推了一个x'
    假设x != 0 A != Pi /2 || 3 * Pi / 2x' = 1 / ( tan(A) + z / x )你认为这是个线性函数吗????不是线性变换的话,就不存在这个矩阵,也就是无解!否则矩阵就不会在线性代数里面讲了!^_^