超大号功率管 超大号功率管
zigbee
关注数: 27 粉丝数: 19 发帖数: 842 关注贴吧数: 21
任意角度图像旋转应用算法 LZ奉献一个多点触控任意角度图像旋转的算法代码,不理解的地方可以来问我 注:只是一个算法实现代码,不要找lz要完整的程序,完毕。 void RotateImage(HDC hdc,int x,int y,HIMG hImg,int angle) { S32 radians; S32 cos_a,sin_a,cos_ay,sin_ay; S32 point1x,point1y,point2x,point2y,point3x,point3y; S32 minx,miny,maxx,maxy; S32 xx,yy,xx0,yy0,xx1,yy1,cx,cy,src_dx,src_dy,dst_dx,dst_dy; GUI_COLOR color; IMAGE *img; DC *pdc; if(hdc==0) return; pdc =HDC2DC(hdc); if(hImg==0) return; img=(void*)hImg; src_dx =img->Width; src_dy =img->Height; angle %=360; //计算外接矩形坐标 radians =(2*PI*angle)/360.0; cos_a =COS(radians)*65536.0; sin_a =SIN(radians)*65536.0; point1x =(-src_dy*sin_a)>>16; point1y =(src_dy*cos_a)>>16; point2x =(src_dx*cos_a-src_dy*sin_a)>>16; point2y =(src_dy*cos_a+src_dx*sin_a)>>16; point3x =(src_dx*cos_a)>>16; point3y =(src_dx*sin_a)>>16; minx =MIN(0,MIN(point1x,MIN(point2x,point3x))); miny =MIN(0,MIN(point1y,MIN(point2y,point3y))); maxx =MAX(point1x,MAX(point2x,point3x)); maxy =MAX(point1y,MAX(point2y,point3y)); if(angle>90&&angle<180) { dst_dx=(int)CEIL(-minx); } else { dst_dx=(int)CEIL(maxx-minx); } if(angle>180&&angle<270) { dst_dy=(int)CEIL(-miny); } else { dst_dy=(int)CEIL(maxy-miny); } cx =(dst_dx>>1); //目标位置中心点的x偏移 cy =(dst_dy>>1); //目标位置中心点的y偏移 cos_ay =(miny*cos_a)>>16; sin_ay =(miny*sin_a)>>16; //////////// if(((IMAGE*)hImg)->Bpp==32) { //ARGB 8888格式(带Alpha通道) for(yy=0;yy<dst_dy;yy++) { cos_ay =((yy+miny)*cos_a)>>16; sin_ay =((yy+miny)*sin_a)>>16; //// yy0 =y+yy-cy; if(yy0<0) continue; if(yy0>pdc->ymax) return; for(xx=0;xx<dst_dx;xx++) { //// xx1 =((((xx+minx)*cos_a)>>16)+sin_ay); //计算坐标 yy1 =(cos_ay-(((xx+minx)*sin_a)>>16)); //// xx0 =x+xx-cx; if(xx1>=0&&xx1<src_dx&&yy1>=0&&yy1<src_dy&&xx0>0&&xx0<pdc->xmax) { color =img->Data[yy1*img->Width+xx1]; pdc->PutPixel(pdc,xx0,yy0,AlphaBlendColor(color,GetPixel(hdc,xx0,yy0),img->AlphaData[yy1*img->Width+xx1])); } } } } else { //不带Alpha通道 for(yy=0;yy<dst_dy;yy++) { cos_ay =((yy+miny)*cos_a)>>16; sin_ay =((yy+miny)*sin_a)>>16; //// yy0 =y+yy-cy; if(yy0<0) continue; if(yy0>pdc->ymax) return; for(xx=0;xx<dst_dx;xx++) { //// xx1 =((((xx+minx)*cos_a)>>16)+sin_ay); //计算坐标 yy1 =(cos_ay-(((xx+minx)*sin_a)>>16)); //// xx0 =x+xx-cx; if(xx1>=0&&xx1<src_dx&&yy1>=0&&yy1<src_dy&&xx0>0&&xx0<pdc->xmax)
1 下一页