数学建模社区-数学中国

标题: 任意角度图片旋转 [打印本页]

作者: 韩冰    时间: 2005-1-26 12:47
标题: 任意角度图片旋转

void S_PicXZ(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)// % m$ \$ f. Y% K+ C( `1 Z7 ~; I { 8 s; u9 L, G. B* x2 z6 j! @) Rif(angle>180)angle=360-angle; # ~- W# V* h' P* z" n: ?/ B4 |if(angle<-180)angle=360+angle;

$ ]3 Q% v( e3 D, a

float radians=(2*3.1416*angle)/360; 5 | A, {) u2 u$ T4 d1 ?/ | float cosine=(float)cos(radians); - T6 D' C. u+ H7 r6 h$ y& Vfloat sine=(float)sin(radians); 3 w4 c7 d5 z1 c4 v- Y3 a- J+ G) _ float Point1x=(-Source->Height*sine); 9 v: \' E, _# z) y8 ^5 i float Point1y=(Source->Height*cosine); 9 B: p8 f4 n8 N, Ofloat Point2x=(Source->Width*cosine-Source->Height*sine); 6 G0 j+ Z7 l8 @. P6 ?% q6 Pfloat Point2y=(Source->Height*cosine+Source->Width*sine); 8 x) R" \4 W6 c float Point3x=(Source->Width*cosine); B! L ]0 }# X5 e7 ~float Point3y=(Source->Width*sine); 4 W$ }$ e( M3 I5 Y- L/ E7 ~float minx=min((float)0,min(Point1x,min(Point2x,Point3x))); 0 s, m& w! j$ X' J# X9 vfloat miny=min((float)0,min(Point1y,min(Point2y,Point3y))); 3 Q6 U; j, h% nfloat maxx=max(Point1x,max(Point2x,Point3x)); * m4 S& p1 D2 R+ y9 O7 _ float maxy=max(Point1y,max(Point2y,Point3y)); / [* P S8 R) `2 k) m/ C. A int DestBitmapWidth,DestBitmapHeight; & j! ]3 U9 @0 n. ?/ E0 ~; J2 T( x8 U if(angle>90&&angle<180) & b8 J: z* [9 w DestBitmapWidth=(int)ceil(-minx); 0 Z: J0 k4 W. i8 N4 l& _- Q+ O else , b: i3 n) ~6 y7 \3 z% ?8 e: q; | DestBitmapWidth=(int)ceil(maxx-minx);

4 m0 z9 m$ j. }9 [- Y! X+ d

if(angle>-180&&angle<-90) & E8 B' X* s2 ] DestBitmapHeight=(int)ceil(-miny); * q# ~6 l* S; Y6 R5 T' `* l0 C Y else 2 O$ z$ y8 n. ]6 X8 W DestBitmapHeight=(int)ceil(maxy-miny);

# y( C& h$ f8 o; C* O5 w

NewPic->Height=DestBitmapHeight; # T0 c7 E* _5 @3 q' hNewPic->Width=DestBitmapWidth; 5 Z' V+ C7 X4 V# R' } for(int x=0;x<DestBitmapWidth;x++) 7 }: S( n, Y V& @; V { 9 _6 j0 z" \2 T) i! y for(int y=0;y<DestBitmapHeight;y++){ ) R. Y' {' H% W; hint SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine); " l- S/ g' U* K# r e! G4 aint SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine); 2 \7 _' J3 ?; M2 H8 o if(SrcBitmapx>=0&&SrcBitmapx<Source->Width&&SrcBitmapy>=0&& ! I4 `: C' `3 [; _- E( N# F. }8 m: cSrcBitmapy<Source->Height) 5 N% C. f2 U/ L! g+ Y { % H' s3 S) h3 j& h( A+ pNewPic->Canvas->ixels[x][y]= : n# }! g \: {/ I1 I. m Source->Canvas->ixels[SrcBitmapx][SrcBitmapy]; $ R I5 h6 w& o9 r& b' X } 4 r+ w4 n& _/ m5 S4 Q% m# n0 O } # M$ }9 n( u0 X: J- v4 ^} , A$ d1 x- ^; K+ l6 Q }






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5