问题具体描述如下:
图象f(x)在XOY平面内(也就是你的电脑屏幕所处的平面)
要求:f(x)沿Y轴旋转30度(已经旋转出了XOY平面)
求:沿与你的电脑屏幕垂直的方向,也就是Z方向看过去:显示旋转后的图象
注意视角是:与你的电脑屏幕垂直的方向,也就是Z方向
麻烦各位朋友帮俺看看!很着急!先谢谢啦!:)
图象f(x)在XOY平面内(也就是你的电脑屏幕所处的平面)
要求:f(x)沿Y轴旋转30度(已经旋转出了XOY平面)
求:沿与你的电脑屏幕垂直的方向,也就是Z方向看过去:显示旋转后的图象
注意视角是:与你的电脑屏幕垂直的方向,也就是Z方向
麻烦各位朋友帮俺看看!很着急!先谢谢啦!:)
本封装库对图象读取,特效,显示进行封装
功能有:对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
图象的几何变换算法 详细信息 < 图形算法 > 此代码实现了图象的平移,旋转,镜像,转置,缩放等几何变换算法.
{
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;
}
假设图像的左上角为(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) 释放内存图像缓冲区。
值得指出的是,这种处理方法不够。为此可以采用另一种方法:先在图像变换缓冲区中处理完毕后,再将变换后的图像一次显示在屏幕上。这样可以取得较好的显示效果。
先将图象做Fourier变换,然后,对fourier结果做相应的平移,
然后对平移的结果做反Fourier变换,得到图象在空间旋转的结果。
这个思路可以吗?
那么我有如下的问题:
相对应于在空间域内绕Y轴旋转30度的效果,在频域空间应该做怎样的平移呢?
我正在寻找二者之间的对应关系。]
思索中。
各位,帮忙看看这个思路可行吗?