问题具体描述如下:
  图象f(x)在XOY平面内(也就是你的电脑屏幕所处的平面)
  要求:f(x)沿Y轴旋转30度(已经旋转出了XOY平面)
  求:沿与你的电脑屏幕垂直的方向,也就是Z方向看过去:显示旋转后的图象
  注意视角是:与你的电脑屏幕垂直的方向,也就是Z方向
  麻烦各位朋友帮俺看看!很着急!先谢谢啦!:)

解决方案 »

  1.   

    http://www.vckbase.com/code/downcode.asp?id=1685
    本封装库对图象读取,特效,显示进行封装
    功能有:对gif,pcx,tga,jpg等图像格式的读取,进行亮度,对比度,图像旋转,浮雕,颜色反转,锐化,平滑,马赛克处理.
    包括全部源代码.
    编译这个DEMO需要较新的SDK,如果没有可以下载作者摘录的一些必须的文件
    http://www.vckbase.com/code/downcode.asp?id=1551
    图象读取,特效,显示封装库FLib及DEMO源代码 详细信息 < 图形算法 >  本封装库对图象读取,特效,显示进行封装
    功能有:对gif,pcx,tga,jpg等图像格式的读取,进行亮度,对比度,图像旋转,浮雕,颜色反转,锐化,平滑,马赛克处理.
    包括全部源代码.
    编译需要最新的SDK! http://www.vckbase.com/code/downcode.asp?id=346
    图象的几何变换算法 详细信息 < 图形算法 >  此代码实现了图象的平移,旋转,镜像,转置,缩放等几何变换算法. 
      

  2.   

    Rotate(double Angle)//24位旋转
    {
    if ( pPixels == NULL )
    return Empty; double dx,dy,dx1,dy1;
    int Tcx,Tcy;
    dx1 = (double)mSize.cx/2 ;
    dy1 = (double)mSize.cy/2; double sinA = sin(Angle);
    double cosA = cos(Angle);
    double DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;//目标图四角坐标(以图像中心为坐标原点)
    DstX1 = -cosA*dx1 + sinA*dy1 ;
    DstY1 =  sinA*dx1 + cosA*dy1 ;
    DstX2 =  cosA*dx1 + sinA*dy1 ;
    DstY2 = -sinA*dx1 + cosA*dy1 ;
    DstX3 = -cosA*dx1 - sinA*dy1 ;
    DstY3 =  sinA*dx1 - cosA*dy1 ;
    DstX4 =  cosA*dx1 - sinA*dy1 ;
    DstY4 = -sinA*dx1 - cosA*dy1 ; dx = max(fabs(DstX4-DstX1),fabs(DstX3-DstX2));
    dy = max(fabs(DstY4-DstY1),fabs(DstY3-DstY2)); img_Matrix3x3 Matrix3x3 = {  cosA, sinA, 0,
    -sinA, cosA, 0,
    DstX1+dx/2, DstY4+dy/2, 1}; //clockwize Tcx = int(dx) ;
    Tcy = int(dy) ;
    BYTE *pBuf = new BYTE [Tcx * Tcy ];
    int i,j;
    int SrcLength = mSize.cx * mSize.cy ;
    int TarLength = Tcx * Tcy ;
    BYTE *pSrcChannel = new BYTE [SrcLength] ;
    BYTE *pTarChannel = new BYTE [TarLength] ;
    BYTE *pSrc = (BYTE*)pPixels ;
    BYTE *pTar = (BYTE*)pBuf ; for (j = 0 ; j < 3 ; j++)
    {
    for (i = 0 ; i < SrcLength ; i++)
    *(pSrcChannel+i) = *(pSrc + i*3 + j) ; AffineTransform(pTarChannel, Tcx, Tcy,
    pSrcChannel, mSize.cx, mSize.cy, Matrix3x3); for (i = 0 ; i < TarLength ; i++)
    *(pTar + i*3 + j) = *(pTarChannel+i) ;
    }
    delete []pSrcChannel ;
    delete []pTarChannel ;
    return true;
    }
      

  3.   

    图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。
      假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter,ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为:
    xcenter = (right - left + 1) / 2 + left;
    ycenter = (bottom - top + 1) / 2 + top;
    x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;
    y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;
      与图像的镜像变换相类似,也采用按行逐点变换的方式实现图像的旋转,其步骤如下:
      (1) 用getimage()把图像保存到内存缓冲区,并擦除原图像。
      (2) 计算图像高度height,宽度width,及保存一行图像信息占用的字节数linebytes,计算公式与镜像变换的计算公式相同。
      (3) 对图像逐行进行旋转变换。
      (4) 释放内存图像缓冲区。
      值得指出的是,这种处理方法不够。为此可以采用另一种方法:先在图像变换缓冲区中处理完毕后,再将变换后的图像一次显示在屏幕上。这样可以取得较好的显示效果。
      

  4.   

    受zfive5(醉马不肖)的指点,我做出了如下思路:
    先将图象做Fourier变换,然后,对fourier结果做相应的平移,
    然后对平移的结果做反Fourier变换,得到图象在空间旋转的结果。
    这个思路可以吗?
      那么我有如下的问题:
      相对应于在空间域内绕Y轴旋转30度的效果,在频域空间应该做怎样的平移呢?
      我正在寻找二者之间的对应关系。]
      思索中。
      各位,帮忙看看这个思路可行吗?