C# GDI+ 画心形 跳动动画

先看看效果:

 话不多说直接上代码

        public Form1()
        {
            DoubleBuffered = true;  //首先窗体记得设置双缓冲
            SetStyle(ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
            InitializeComponent();
        }
        /// <summary>
        /// 是否反向
        /// </summary>
        private bool goBack = false;
        /// <summary>
        /// 当前跳动动画缩放倍率
        /// </summary>
        private int iZoom = 10;
        /// <summary>
        /// 跳动速度
        /// </summary>
        private int Speed { get; set; } = 8;
        /// <summary>
        /// 绘制笔刷颜色
        /// </summary>
        private Brush Color { get; set; } = Brushes.LightPink;
        /// <summary>
        /// 中心缩放倍率
        /// </summary>
        private int Zoom { get; set; } = 10;
        /// <summary>
        /// 点数量(包括心形边线和粒子)
        /// </summary>
        private int Particle { get; set; } = 20;
        /// <summary>
        /// 一次扩散范围
        /// </summary>
        private int FirstDiffusion { get; set; } = 10;
        /// <summary>
        /// 二次扩散范围
        /// </summary>
        private int SecondDiffusion { get; set; } = 30;

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            iZoom += goBack ? -1 : 1;
            if (iZoom >= (Zoom + 2) || iZoom <= (Zoom - 3))
                goBack = !goBack;
            Bitmap bmp = new Bitmap(Width, Height);
            Graphics g = Graphics.FromImage(bmp);  //如果想看到绘制的过程可以使用 e.Graphics 直接绘制在窗体上而不是绘制在图片中再替换背景
            Random random = new Random();
            for (int i = 0; i < Particle * 100; i++)
            {
                double t = random.NextDouble() * 2 * Math.PI;
                double x = 16 * (Math.Pow(Math.Sin(t), 3));  //心形曲线函数X
                double y = -(13 * Math.Cos(t) - 5 * Math.Cos(2 * t) - 2 * Math.Cos(3 * t) - Math.Cos(4 * t));  //心形曲线函数Y
                x *= iZoom;
                y *= iZoom;
                x += Width / 2;
                y += Height / 2;
                g.FillEllipse(Color, new Rectangle((int)x, (int)y, 10, 10));  //在随机到的心形函数路径上添加点
                if (i % 2 == 0)  //控制扩散点的数量
                {
                    Random random2 = new Random();
                    int add1 = random2.Next(-FirstDiffusion, FirstDiffusion);
                    int add2 = random2.Next(-FirstDiffusion, FirstDiffusion);
                    g.FillEllipse(Color, new Rectangle((int)x + add1, (int)y + add2, 5, 5));  //一次扩散的点
                    g.FillEllipse(Color, new Rectangle((int)x + add1, (int)y + add2, 5, 5));
                }
                if (i % 3 == 0)
                {
                    Random random2 = new Random();
                    int add1 = random2.Next(-SecondDiffusion, SecondDiffusion);
                    int add2 = random2.Next(-SecondDiffusion, SecondDiffusion);
                    g.FillEllipse(Color, new Rectangle((int)x + add1, (int)y + add2, 5, 5));  //二次扩散的点
                    g.FillEllipse(Color, new Rectangle((int)x + add1, (int)y + add2, 5, 5));
                }
            }
            BackgroundImage = bmp;
            Thread.Sleep((10 - Speed) * 10);
        }

最后添加一个设置界面,使得功能多样化一点:

 源码下载:C# 用GDI+ 画心形 跳动动画(.采用net core 6.0框架)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忧郁的蛋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值