图片旋转!! 有一个图片 在屏幕中间显示 想让这个图片沿着顺时针一秒的旋转 这么弄···求教·· 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 根据坐标来做旋转变换,再插值!http://game.chinaitlab.com/devdoc/720850.html 如果你只旋转90°那么GDI+很简单就可以实现了!!如果你要任意角旋转,那就要计算旋转圆心,坐标,还要保持足够大旋转空间不然会变形 //2D图rotate/move/scalevoid scr_rotate(LHxx2DIMAGE *sc,float angle,float scale){ float dx,dy,dw,dh;//临时变量 float sw = sc->LHxxIw;//image width float sh = sc->LHxxIh;//image height float sclx,scly,sclw,sclh;//复位并放缩的坐标(局部坐标系--image的坐标系) float hotx =sw/2;//旋转中心 float hoty =sh/2; //复位 放缩 , 旋转 ,平移 float xscale=scale; float yscale=scale; //复位并放缩后的区域 sclx = -hotx*scale; scly = -hoty*scale; sclw = (sw - hotx); sclh = (sh - hoty); float sint, cost; sint = sinf(angle); cost = cosf(angle); float w=sc->LHxxIw/2,h=sc->LHxxIh/2; LHxxSCREENVERTEX* ss; sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 ); ((LHxxSCREENVERTEX *)ss)[0].LHxxSx = sclx*cost - scly*sint + sc->LHxxIx+w; ((LHxxSCREENVERTEX *)ss)[0].LHxxSy = sclx*sint + scly*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[1].LHxxSx = sclw*cost - scly*sint + sc->LHxxIx+w; ((LHxxSCREENVERTEX *)ss)[1].LHxxSy = sclw*sint + scly*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[2].LHxxSx = sclx*cost - sclh*sint + sc->LHxxIx+w; ((LHxxSCREENVERTEX *)ss)[2].LHxxSy = sclx*sint + sclh*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[3].LHxxSx = sclw*cost - sclh*sint + sc->LHxxIx+w; ((LHxxSCREENVERTEX *)ss)[3].LHxxSy = sclw*sint + sclh*cost + sc->LHxxIy+h; sc->LHxx2DMVertexBuffer->Unlock();} GDI+SetTransform(Matrix*)或RotateAt(...) http://www.51log.net/dev/5010/5017325.htm so easy。。使用CxImage类库,先加载图片,然后调用CxImage::Rotate()方法,随便你调什么角度,代码量不超过10行。。 C++语法 对话框焦点和键盘处理的问题 想要这样一个函数,貌似叫圆函数。各位帮忙! VC组播程序的问题 .h文件里这样初始化string[]为什么不对? 进程间CString字符串传送出现乱码,请教如何处理 c++学了两年了vc用了1年了,下面学习java 还是c#给点建议 在CMyEditView中,在插入符(光标Caret)所在行中,如何得到Caret前后的二个字符串? 我要取出文本文件中的行数,用fgets,结果有的行字符数小于5时就退出来了。谁能帮我 我的分数哪去了? [win32]用双缓冲画图,打开文件时界面显示黑屏。 如果要在Win32窗口加载一张可以移动图片要用缓冲区么?
如果你要任意角旋转,那就要计算旋转圆心,坐标,还要保持足够大旋转空间不然会变形
{
float dx,dy,dw,dh;//临时变量
float sw = sc->LHxxIw;//image width
float sh = sc->LHxxIh;//image height
float sclx,scly,sclw,sclh;//复位并放缩的坐标(局部坐标系--image的坐标系)
float hotx =sw/2;//旋转中心
float hoty =sh/2;
//复位 放缩 , 旋转 ,平移 float xscale=scale;
float yscale=scale; //复位并放缩后的区域
sclx = -hotx*scale;
scly = -hoty*scale;
sclw = (sw - hotx);
sclh = (sh - hoty); float sint, cost;
sint = sinf(angle);
cost = cosf(angle); float w=sc->LHxxIw/2,h=sc->LHxxIh/2; LHxxSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 ); ((LHxxSCREENVERTEX *)ss)[0].LHxxSx = sclx*cost - scly*sint + sc->LHxxIx+w;
((LHxxSCREENVERTEX *)ss)[0].LHxxSy = sclx*sint + scly*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[1].LHxxSx = sclw*cost - scly*sint + sc->LHxxIx+w;
((LHxxSCREENVERTEX *)ss)[1].LHxxSy = sclw*sint + scly*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[2].LHxxSx = sclx*cost - sclh*sint + sc->LHxxIx+w;
((LHxxSCREENVERTEX *)ss)[2].LHxxSy = sclx*sint + sclh*cost + sc->LHxxIy+h; ((LHxxSCREENVERTEX *)ss)[3].LHxxSx = sclw*cost - sclh*sint + sc->LHxxIx+w;
((LHxxSCREENVERTEX *)ss)[3].LHxxSy = sclw*sint + sclh*cost + sc->LHxxIy+h;
sc->LHxx2DMVertexBuffer->Unlock();
}
SetTransform(Matrix*)
或
RotateAt(...)
使用CxImage类库,先加载图片,然后调用CxImage::Rotate()方法,随便你调什么角度,代码量不超过10行。。