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

}

相关推荐
消失的旧时光-19431 小时前
C 语言如何实现“面向对象”?—— 从 struct + 函数指针,到 Linux 内核设计思想
linux·c语言·开发语言
handler011 小时前
滑动窗口(同向双指针)算法:模板与例题解析
c语言·c++·笔记·算法·蓝桥杯·双指针·滑动窗口
白小沫1 小时前
TortoiseSVN 的快速安装与常用操作
经验分享·笔记
Marry Andy2 小时前
langgenius/dify-sandbox:0.2.12启动崩溃
人工智能·经验分享·python
薇茗2 小时前
【初阶数据结构】 升沉有序的平仄 排序
c语言·数据结构·算法·排序算法
yoyo_zzm2 小时前
五大编程语言对比:PHP、C、C++、C#、易语言
c语言·c++·php
铅笔小新z3 小时前
【C语言】数组详解
c语言·开发语言
努力努力再努力wz3 小时前
【Redis入门系列】Redis基础命令详解:从客户端连接到数据读写、key 管理与过期机制
c语言·开发语言·数据结构·数据库·c++·redis·缓存
谙弆悕博士3 小时前
【附C源码】C语言实现散列表
c语言·开发语言·数据结构·算法·散列表·数据结构与算法