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

}

相关推荐
GeekArch17 小时前
第8讲:裸机单片机项目——Vibe快速迭代的最优边界
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·ai编程
LaughingZhu17 小时前
Product Hunt 每日热榜 | 2026-07-17
前端·数据库·人工智能·经验分享·mysql·chatgpt·html
yuenineon17 小时前
任务执行与自主推理:RPA、智能体底层架构差异解析
经验分享
慧都小项18 小时前
C/C++ 静态分析为什么要前移?Parasoft C/C++test 在 IDE 与 CI/CD 中的应用
c语言·c++·ide·功能测试·ai
qq_337763201918 小时前
国际期货资管系统开发方案|内外盘交易平台源码授权与二次开发支持
java·c语言·开发语言·c++·c#
不一样的故事12619 小时前
军工行业合规与基础认知
数据结构·经验分享·算法
openKylin1 天前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
迷茫、Peanut1 天前
C语言sizeof和strlen
c语言
德思特1 天前
从人工测试到自动化验证:AutoGNSS 如何重构GNSS测试流程?
经验分享
LaughingZhu1 天前
Product Hunt 每日热榜 | 2026-07-16
人工智能·经验分享·深度学习·神经网络·产品运营