Winform GDI+绘图二:绘制旋转太极图
大家好,今天有时间给大家带来Winform自绘控件的第二部分,也是比较有意思的一个控件:旋转太极图。
大家可以停下思考一下,如果让你来绘制旋转的太极图,大家有什么样的思路呢?我今天跟大家展示一下,我平时绘制所用的思路,还请各位不吝赐教。
其实连续的动画效果,微观上去看,就是将这连续的时间切成一小段一小段,太极图只要在每一小段时间移动一定角度。那么在宏观上看将会是连续的动画。所以整体的思路就有了:
在每一小段的时间将,改变绘制起始角度,触发控件重绘,就可以形成连续的动画效果。因为是围绕控件中心进行旋转,所以要使用TranslateTransform函数,将原点移至控件中心位置,代码如下图:
g.TranslateTransform(Width / , Width / );
在绘制太极之前,先将画布旋转一定角度,angle是一个变量,这样当我定时去改变angle时,太极图将会先旋转到不同的位置,再进行绘制:
g.RotateTransform(angle);
在绘制完成之后,将画图原点移到左上角:
g.TranslateTransform(-Width / , -Width / );
定时改变angle的任务就交给Timer定时器即可:
private void timer1_Tick(object sender, EventArgs e)
{
if (rotateSpeed != )
{
angle += (int)(rotateSpeed * 360f / Math.PI/);
if (angle >=)
angle -= ;
if (angle <= -)
angle += ;
}
Invalidate();
}
控件的onpaint方法:
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
g.TranslateTransform(Width / , Width / );
g.RotateTransform(angle);
//绘制黑色部分
using (GraphicsPath path = new GraphicsPath())
{
path.AddArc(-Width/, -Width/, Width, Width, , );
path.AddArc(-Width/, -Width / , Width / , Width / , , -);
path.AddArc(, -Width / , Width / , Width / , , );
g.FillPath(Brushes.Black, path);
g.FillPie(Brushes.White, new Rectangle(Width * / -Width/, Width * / -Width/, Width * / , Width * / ), , );
}
//绘制白色部分
using (GraphicsPath path = new GraphicsPath())
{
path.AddArc(-Width / , -Width / , Width, Width, , -);
path.AddArc(-Width / , -Width / , Width / , Width / , , -);
path.AddArc(, -Width / , Width / , Width / , , );
g.FillPath(Brushes.White, path);
g.FillPie(Brushes.Black, new Rectangle(Width * / - Width / , Width * / - Width / , Width * / , Width * / ), , );
}
g.TranslateTransform(-Width / , -Width / );
base.OnPaint(e);
}
整体效果如下:

项目已开源,开源地址:https://gitee.com/james_happy/IndustryControls,欢迎Star与Fork
Winform GDI+绘图二:绘制旋转太极图的更多相关文章
- .NET绘制旋转太极图
.NET绘制旋转太极图 我之前发了一篇<用.NET写"算命"程序>的文章,但有人纷纷提出了质疑,认为没有"科学"(mi xin)依据
- Winform GDI+ 绘图一:绘制2D电池
winform桌面软件开发,在工业控制领域的使用还是很广泛的,打算好好学习一下GDI+绘图.以前都是用别人的轮子,自己也打算封装一些工业控制领域常用的控件. 今天要将的是,利用缓动函数动态绘制电池. ...
- 基于CSS3伪元素和动画绘制旋转太极图
通过CSS3的动画知识来完成一个旋转的太极. 任务 1.创建一个div,用CSS控制其大小.边框.位置等,做成一个静态的圆形,一半为红色一半为白色. 2.用div的伪元素位置两个圆环并放置核实位置,使 ...
- Html5 绘制旋转的太极图
采用Html5+JavaScript在Canvas中绘制旋转的太极图,如下图所示: 具体思路和绘制逻辑,在上图中已有说明,代码如下: <script type="text/javasc ...
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
- HTML 5:绘制旋转的太极图
HTML: <!DOCTYPE> <html> <head> <meta charset="utf-8" /> <title& ...
- WinForm GDI+ 资料收集
UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序.UI编程体现在两个方面, ...
- C# GDI+绘图介绍
最近查阅网上资料,将GDI+的基本知识汇总如下: 一.基本的知识 GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能; 在C#. ...
- Winform GDI+
什么是GDI+ GDI (Graphics Device Interface), 是属于绘图方面的 API (Application Programming Interface). 因为应用程序不能直 ...
随机推荐
- Unity 游戏框架搭建 2019 (三十六~三十八) partial与public
在上一篇,我们把菜单的顺序从头到尾整理了一遍.在整理菜单顺序的过程中,记录了一个要做的事情. 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 整理完菜单顺序后,学习新的知识,解决随着示例 ...
- Deepin15.11-mysql5.7安装与配置
目录 1.卸载 2.换源 3.安装mysql-5.7并修改密码 4.修改mysql中字符编码 deepin系统中,默认的系统源,使用apt-get install mysql-server会自动拉取m ...
- 深入理解BIO、NIO、AIO
导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...
- python学习08排序算法举例
'''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...
- 标准库shutil
shutil模块是高级的 文件.文件夹.压缩包 处理模块. 下面是关于其中各种方法的使用介绍: 1.shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一 ...
- Redis(二):单机数据库的实现
概要 本部分内容主要是研究单机数据库.分别介绍单机数据库的实现原理,数据库的持久化,Redis事件,服务器维护管理客户端以及单机服务器的运作机制. 数据库 数据库结构 Redis数据库由redis.h ...
- JavaScript实现选择排序
一.选择排序简介 **冒泡排序.插入排序.选择排序合称为简单排序.**下面是选择排序的思想: 假设有一个数组a,我们想象成有一个班级名叫a班,现在全班随意排成一排,排头的位置是a[0],排尾的位置是a ...
- Airtest常见的素定位不到
一.为什么发这博客 前几天业务需要需要操作云手机进行爬取没办法只有混进airtest官方群边学习边进行开发,蛮简单的东西(可能是我之前会selenium,appuim关系吧),但是群里会有很多问题,关 ...
- CF思维联系– CodeForces -CodeForces - 992C Nastya and a Wardrobe(欧拉降幂+快速幂)
Nastya received a gift on New Year - a magic wardrobe. It is magic because in the end of each month ...
- 单源最短路径:Dijkstra算法(堆优化)
前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...