2022年11月8日.NET 7正式發佈 .NET仍然是最快、最受歡迎、最值得信賴的平臺之一,其龐大的.NET軟體包生態系統包括33萬多個軟體包。 .NET 7為您的應用程式帶來了更高的性能和C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web APIs、WinF ...
最近聽說什麼國產神劇的期中考試畫心形題很火,打算跟風用C#復刻一下
先看看效果:
話不多說直接上代碼
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);
}
最後添加一個設置界面,使得功能多樣化一點:
源碼:
附件