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

}

相关推荐
布莱克60523 分钟前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
混凝土拌意大利面1 小时前
分类量化定价法
经验分享
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
德思特9 小时前
Robotaxi规模化加速,“信号难题”如何解决?
经验分享
Navigator_Z12 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
统计学小王子13 小时前
数学建模十万个为什么(一)
经验分享·数学建模
陕西企来客14 小时前
企来客科技发布企业知识图谱GEO优化专项服务:从“信息曝光“升级到“实体置信度“
经验分享·ai
是隼人14 小时前
buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
CAYA-15 小时前
模电笔记1.1 半导体基础与 PN 结
经验分享·笔记·学习方法
易知微EasyV数据可视化17 小时前
大型工厂/港口/城市级孪生构建:多源三维数据如何实现高效协同?
经验分享