未期 發表於 2022-11-9 22:17:00

C# GDI+ 画心形 跳动动画

<p>最近听说什么国产神剧的期中考试画心形题很火,打算跟风用C#复刻一下</p>
<p>先看看效果:<br>
<img src="https://img2022.cnblogs.com/blog/1590854/202211/1590854-20221109220422941-273081521.gif"></p>
<p>话不多说直接上代码</p>
<pre><code class="language-C#">      public Form1()
      {
            DoubleBuffered = true;//首先窗体记得设置双缓冲
            SetStyle(ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
            InitializeComponent();
      }
</code></pre>
<pre><code class="language-C#">      /// &lt;summary&gt;
      /// 是否反向
      /// &lt;/summary&gt;
      private bool goBack = false;
      /// &lt;summary&gt;
      /// 当前跳动动画缩放倍率
      /// &lt;/summary&gt;
      private int iZoom = 10;
      /// &lt;summary&gt;
      /// 跳动速度
      /// &lt;/summary&gt;
      private int Speed { get; set; } = 8;
      /// &lt;summary&gt;
      /// 绘制笔刷颜色
      /// &lt;/summary&gt;
      private Brush Color { get; set; } = Brushes.LightPink;
      /// &lt;summary&gt;
      /// 中心缩放倍率
      /// &lt;/summary&gt;
      private int Zoom { get; set; } = 10;
      /// &lt;summary&gt;
      /// 点数量(包括心形边线和粒子)
      /// &lt;/summary&gt;
      private int Particle { get; set; } = 20;
      /// &lt;summary&gt;
      /// 一次扩散范围
      /// &lt;/summary&gt;
      private int FirstDiffusion { get; set; } = 10;
      /// &lt;summary&gt;
      /// 二次扩散范围
      /// &lt;/summary&gt;
      private int SecondDiffusion { get; set; } = 30;

      protected override void OnPaint(PaintEventArgs e)
      {
            base.OnPaint(e);
            iZoom += goBack ? -1 : 1;
            if (iZoom &gt;= (Zoom + 2) || iZoom &lt;= (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 &lt; 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);
      }
</code></pre>
<p>最后添加一个设置界面,使得功能多样化一点:<br>
<img src="https://img2022.cnblogs.com/blog/1590854/202211/1590854-20221109220844818-1767298210.gif"></p>
<p>源码:<br>
附件</p><br><br>
来源:https://www.cnblogs.com/Alex1911/p/16875349.html
頁: [1]
查看完整版本: C# GDI+ 画心形 跳动动画