C语言矩形旋转算法介绍

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 ();

}

相关推荐
光视界1 小时前
具身数采专项对比:ZED 双目相机 VS Intel RealSense,机器人数据集采集谁更合适?
经验分享·机器人
小向是个Der9 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
总线通信小百科11 小时前
车载以太网模块、交换机与媒体转换器:三类设备怎么选?
经验分享·车载以太网
bkspiderx11 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
2601_9672127214 小时前
安全型轨道式插座合规资质核查与工程选型技术要点
大数据·经验分享·安全
LDR00616 小时前
LDR6100 智能遥控器精品软文:Type-C 充电口与低功耗量产维护
c语言·开发语言
一只代码猿17 小时前
Screen Studio 免费邪修用法:剪视频完全无痛(附提示词)
经验分享
蒋胜山17 小时前
VBScript007-Excel的99乘法表
经验分享·batch
德思特18 小时前
实操指南|从“能驻网“到“能上网“:手机入网与公网业务实验室测试分享
经验分享·无线通信
FLJwu19 小时前
运动相机采购实战|第四篇(终章):一张清单走完选型全流程,把风险拦在源头
c语言·开发语言·数码相机·运动相机·oem 量产