C语言矩形旋转算法介绍
参数传入的一般方法是图形区用鼠标拉出矩形, 依据 left, top, right, bottom 二个坐标点值gx0,gy0,gx1,gy1来绘制矩形,即左上角和右下角坐标。不管从那个角度拉矩形,都将坐标点转换为这两个坐标点。
依参数来计算图形中心点坐标 sx,sy。
若设置角度值 d 就可以实现矩形旋转图形的画出。
我设置的数据输入方法是,手机屏幕图形区任意位置点击,以屏幕的XY坐标值来计算直角平面坐标系四个象限的以XY轴交点为中心点的坐标,即计算绘图区的左上角left,top,右下角right,bottom的坐标值,依次就可绘制图形。一、三象限的值可以通过计算转换为二、四象限的左上角和右下角的坐标值。
屏幕拉出矩形,设置gx0, gy0, gx1, gy1
依屏幕点击坐标x, y计算绘图坐标,图形区高720,中点是360
dx=(int)(x/10)*10 ; //取整计算
dy=(int)(y/10)*10 ;
if (dx<=360){ gx0=dx; gx1=360+(360-dx) ; }
if (dx>360){ gx0=360-(dx-360); gx1=dx; }
if (dy<=360){ gy0=dy; gy1=360+(360-dy) ; }
if (dy>360){ gy0=360-(dy-360); gy1=dy; }
图形旋转的公式:
a=2*pi/180*k;
2pi/180 整圆,pi/180半圆,k = 0 to 180
x0=(float)(L*cos(a)); //原点顺时针绘出
y0=(float)(L*sin (a));
x1, y1 >>> 依原点 x0, y0 和 旋转角度 d 计算
x1=(float)(x0*cos (d)-y0*sin (d))+sx ;
y1=(float)(y0*cos (d)+x0*sin (d))+sy ;
三角形、椭圆形矩形以及多边形多角形的图形旋转的计算方法都是一样。
下面是矩形旋转函数:
Rotate_Rect (){
//**** Draw Rect and Rotate ********
//** 传入:left, top, right, bottom
//** 计算: r 半径, sx, sy 圆心点
//** 拉鼠标画出矩形 >> 坐标数据传入
// gx0=200; gy0=220; //left, top
// gx1=520; gy1=500; //right, bottom
//** 依据输入计算图形中心点 sx, sy
//** calculate the center point
//** 计算外接圆圆心 O点 (sx, sy)
sx=gx0+(gx1-gx0)/2 ; //中心点坐标 X
sy=gy0+(gy1-gy0)/2 ; //中心点坐标 Y
//** 计算外接圆半径 r ,
a=(gx1-gx0)/2 ;
b=(gy1-gy0)/2 ;
c=sqrt (a*a+b*b);
r=(int) c; //计算圆半径
//** draw title
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,0,250,250);
cs.SetTextSize (24);
cs.DrawText ("figure 4 ", sx-30, sy-r-15);
//** 用Canvas内置的图形绘制函数画模拟矩形图形,矩形外接圆
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor (255,100,100,100);
cs.DrawCircle (sx,sy, r); //外接圆
// cs.DrawRect (gx0,gy0, gx1,gy1); //原矩形
//** 矩形旋转坐标起点
x0=gx0; y0=gy0;
x1=gx1; y1=gy0;
x2=gx1; y2=gy1;
x3=gx0; y3=gy1;
//** 圆内接矩形,画原矩形
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,150,150,150);
cs.DrawLine (x0,y0,x1,y1);
cs.DrawLine (x1,y1,x2,y2);
cs.DrawLine (x2,y2,x3,y3);
cs.DrawLine (x3,y3,x0,y0);
//** test rotate >>>
//setD=45; //输入旋转角度
d=pi/180*setD; //角度转弧度
//** 四角点旋转
sx0=(float)((x0-sx)*cos (d)-(y0-sy)*sin (d)) ;
sy0=(float)((x0-sx)*sin (d)+(y0-sy)*cos(d)) ;
sx1=(float)((x1-sx)*cos (d)-(y1-sy)*sin (d)) ;
sy1=(float)((x1-sx)*sin (d)+(y1-sy)*cos(d)) ;
sx2=(float)((x2-sx)*cos (d)-(y2-sy)*sin (d)) ;
sy2=(float)((x2-sx)*sin (d)+(y2-sy)*cos(d)) ;
sx3=(float)((x3-sx)*cos (d)-(y3-sy)*sin (d)) ;
sy3=(float)((x3-sx)*sin (d)+(y3-sy)*cos(d)) ;
//** 加中心坐标距
sx0=sx0+sx; sy0=sy0+sy;
sx1=sx1+sx; sy1=sy1+sy;
sx2=sx2+sx; sy2=sy2+sy;
sx3=sx3+sx; sy3=sy3+sy;
//** 绘出旋转后图形
cs.SetColor (255,250,0,250);
cs.DrawLine (sx0,sy0,sx1,sy1);
cs.DrawLine (sx1,sy1,sx2,sy2);
cs.DrawLine (sx2,sy2,sx3,sy3);
cs.DrawLine (sx3,sy3,sx0,sy0);
ss=intToString (setD)+" ° " ;
cs.DrawText (ss, sx1+20, sy1+20);
cs.Update ();
}//test Rotate
附图:


test_Rotate (){
//** test draw Rect inter Circle
//** 传入 gx0, gy0, gx1, gy1
//拉鼠标画出矩形 >> 坐标数据传入
// gx0=200; gy0=220; //left, top
// gx1=520; gy1=500; //right, bottom
// setD=45 ;
Rotate_Rect ();
}