各位大虾、前辈们,有谁知道位图的任意角度的旋转吗,我这有一位高人留下的原理,请问哪位有具体的实现方法?很急!    位图可以看成一个n*n的矩阵
    旋转位图实际上相当于选定一个旋转中心 和 一个旋转角度
    把位图中的每个像素都旋转指定角度
    用GetPixel()来获取旋转前像素的颜色
    用SetPixel()来指定旋转后像素的颜色    例如:选定中心点(X0,Y0) 旋转角度θ
    位图中任意一点的坐标值为X,Y 则旋转后的点(x,y)为
    r = sqrt((X-X0)*(X-X0) + (Y-Y0)*(Y-Y0)); //为|XX0|
    x = X0 + r*cos(θ/57.3);
    y = Y0 + r*sin(θ/57.3);

解决方案 »

  1.   

    不用常年等待
    我有例子,留下E_mail,我发给你
      

  2.   

    这个算法已经很清楚了.
    位图是n*n的矩阵, 即二维数组, 二维下标就可以看作是坐标值.其他按公式算
    不过,1.可以把像素值读到二维数组里来,不要每次都GetPixel.
    2.想办法把这么多的乘法运算开方运算换成其他节省时间的方法.
    如果,你可以预备一个大数组, 将所以cos(θ/57.3)和sin(θ/57.3)值准备好.
      

  3.   

    我有详细的算法介绍和源代码,要的话留ENAIL
      

  4.   

    void roll(HANDLE himagedata,HANDLE himagedata_new,
      float tan,int imagewidth,int imageheight)
    {
    unsigned char *imagedata;
    unsigned char *imagedata_new;
    imagedata=(unsigned char*)GlobalLock(himagedata);
    imagedata_new=(unsigned char*)GlobalLock(himagedata_new); float cos,sin; //y=bx+a
    cos=1/(1+tan*tan); //cos=sqrt(1/1+tan*tan)
    cos=sqrt(cos); //sin=tan*cos
    sin=cos*tan; int center_x,center_y;//设置旋转中心
    int yt,xt; //旋转后的像素位置
    float yy,xx; //旋转前的像素位置
    int site_x_y,site_x1_y,site_x_y1,site_x1_y1,x,y,site_current;
    float rgb_x_y,rgb_x1_y,rgb_x_y1,rgb_x1_y1,rgb_xx_yy; center_x=imagewidth/2;
    center_y=imageheight/2; for(int gy=0;gy<imageheight;gy++)
    {
    yt=gy-center_y; //旋转中心移至原点
    for(int gx=0;gx<imagewidth;gx++)
    {
    xt=gx-center_x; //旋转中心移至原点
    site_current=gy*imagewidth+gx;
    yy=yt*cos-xt*sin; //旋转后像素坐标(gx,gy)
    xx=yt*sin+xt*cos; //旋转前像素坐标(xx,yy)
    if((xx>(-center_x))&(xx<(imagewidth-center_x)-1))
    {
    if((yy>(-center_y))&(yy<(imageheight-center_y)-1))
    {
    if(xx>0.0)
    x=xx; //取整
    else
      x=xx-1;
    if(yy>0.0)
      y=yy;
    else
      y=yy-1;
    //线性插补
    site_x_y=(y+center_y)*imagewidth+x+center_x;
    site_x1_y=site_x_y+1;
    site_x_y1=(y+center_y+1)*imagewidth+x+center_x;
    site_x1_y1=site_x_y1+1;
    rgb_x_y=imagedata[site_x_y]*(x+1-xx)*(y+1-yy);
    rgb_x1_y=imagedata[site_x1_y]*(xx-x)*(y+1-yy);
    rgb_x_y1=imagedata[site_x_y1]*(x+1-xx)*(yy-y);
    rgb_x1_y1=imagedata[site_x1_y1]*(xx-x)*(yy-y);
    rgb_xx_yy=rgb_x_y+rgb_x1_y+rgb_x_y1+rgb_x1_y1;
    imagedata_new[site_current]=rgb_xx_yy;
    }
    else
    imagedata_new[site_current]=imagedata[site_current];
    }
    else//当前的像素所对应的原像素超出图像范围时,当前像素的RGB值不变
    imagedata_new[site_current]=imagedata[site_current];
    }
       }
    GlobalUnlock(himagedata);
    GlobalUnlock(himagedata_new);
    }