<think>我们使用GDI+绘制美丽几何图案,例如:分形、曼德勃罗集、旋转多边形、递归图案等。但考虑到示例的简洁性和视觉效果,这里选择绘制一个彩色旋转多边形(万花筒效果)和一个简单的分形树。
注意:以下代码需要在Windows窗体应用程序中实现。我们将创建两个示例:
示例1:绘制彩色旋转多边形(使用三角函数计算顶点)
示例2:绘制递归分形树
我们将使用双缓冲来避免闪烁,并在窗体的Paint事件中进行绘制。
首先,我们创建一个Windows窗体应用程序,并在窗体上添加一个Panel(用于绘制),设置Panel的Dock属性为Fill。
示例1:彩色旋转多边形
思路:计算正多边形的顶点(通过圆上等分点),然后连接这些点形成多边形,并随着时间旋转。
示例2:递归分形树
思路:从一个起点开始,递归地绘制树干和分支,每次分支长度按比例减少,并旋转一定角度。
由于我们无法实现动画效果(需要用到定时器),这里先提供静态绘制的代码,然后说明如何添加动画。
但是,根据用户要求,我们只提供绘制美丽几何图案的示例代码,因此我们先给出静态图案的绘制,然后给出一个简单的动画框架(使用Timer)来实现旋转效果。
由于代码较长,我们将分别实现。
注意:在窗体设计器中,将Panel的DoubleBuffered属性设置为true(通过继承Panel并设置DoubleBuffered属性)或者在窗体上设置DoubleBuffered=true(但这样整个窗体双缓冲,可能不必要)。我们这里采用创建一个双缓冲的Panel控件。
步骤:
1. 创建一个自定义Panel(继承Panel),并设置DoubleBuffered为true。
2. 在自定义Panel中绘制图形。
但是,为了简单,我们直接在窗体上绘制(设置窗体的DoubleBuffered为true),并在Paint事件中绘制。
我们先从彩色旋转多边形开始:
示例1:彩色旋转多边形(静态)
我们将绘制一个正六边形,并填充颜色。然后让这个六边形旋转起来(通过定时器不断改变旋转角度重绘)。
示例2:递归分形树(静态)
由于用户要求示例代码,我们分别给出两个示例的代码,并说明如何整合。
但注意:用户要求的是“美丽几何图案”,我们可以选择其中一个实现。这里我们选择旋转多边形,因为它更符合“美丽”和动态效果。
我们首先实现旋转多边形(带动画效果):
在窗体类中:
- 添加一个Timer组件,设置Interval(例如50毫秒)
- 添加一个float类型的变量angle,用于记录旋转角度
- 在Timer的Tick事件中,增加angle,并调用Refresh()或Invalidate()重绘
- 在窗体的Paint事件中,根据当前angle绘制旋转的多边形
绘制多边形的函数:
- 计算多边形的顶点(使用Math.Sin和Math.Cos,注意角度转弧度)
- 使用Graphics的FillPolygon方法填充多边形(使用不同颜色)
为了美观,我们可以绘制多个旋转的多边形,形成万花筒效果。
下面我们给出代码:
注意:为了简化,我们只绘制一个多边形,但你可以通过循环绘制多个(例如改变半径、颜色等)。
代码实现:
1. 窗体设计:创建一个Windows窗体,拖放一个Timer组件(timer1),设置Enabled为True,Interval为50。
2. 窗体代码:</think>### C# GDI+ 绘制美丽几何图案示例代码
以下是一个使用GDI+绘制彩色旋转多边形(万花筒效果)的示例,结合三角函数计算顶点位置实现动态几何效果:
```csharp
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace GeometricPatterns
{
public partial class MainForm : Form
{
private float rotationAngle = 0;
private readonly Timer animationTimer = new Timer();
public MainForm()
{
InitializeComponent();
DoubleBuffered = true; // 启用双缓冲防止闪烁
animationTimer.Interval = 50; // 20帧/秒
animationTimer.Tick += (s, e) => {
rotationAngle += 1f;
if (rotationAngle >= 360) rotationAngle = 0;
Invalidate();
};
animationTimer.Start();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias; // 抗锯齿
int centerX = ClientSize.Width / 2;
int centerY = ClientSize.Height / 2;
int patternSize = Math.Min(ClientSize.Width, ClientSize.Height) - 100;
DrawRotatingPolygons(g, centerX, centerY, patternSize, 8, 5);
}
private void DrawRotatingPolygons(Graphics g, int centerX, int centerY, int size, int sides, int layers)
{
float angleIncrement = 360f / sides;
float layerSize = size / (layers * 2f);
for (int layer = 0; layer < layers; layer++)
{
Color layerColor = Color.FromArgb(
255,
(int)(255 * (layer / (float)layers)),
(int)(255 * (1 - layer / (float)layers)),
200
);
using (SolidBrush brush = new SolidBrush(layerColor))
using (Pen pen = new Pen(Color.FromArgb(150, layerColor), 2))
{
PointF[] points = new PointF[sides];
float currentSize = size - layer * layerSize * 2;
// 计算多边形顶点坐标
for (int i = 0; i < sides; i++)
{
double angle = (rotationAngle + i * angleIncrement + layer * 15) * Math.PI / 180;
float x = centerX + currentSize * (float)Math.Cos(angle) / 2;
float y = centerY + currentSize * (float)Math.Sin(angle) / 2;
points[i] = new PointF(x, y);
}
// 绘制多边形
g.FillPolygon(brush, points);
g.DrawPolygon(pen, points);
}
}
}
}
}
```
#### 代码说明:
1. **核心算法**:
- 使用三角函数计算多边形顶点坐标:$x = centerX + r \cdot \cos(\theta)$, $y = centerY + r \cdot \sin(\theta)$
- 多层嵌套结构:通过`layers`参数控制嵌套层数
- 动态旋转:`rotationAngle`随时间变化产生旋转效果
2. **视觉效果**:
- 颜色渐变:内层到外层颜色渐变(蓝→紫)
- 抗锯齿处理:`SmoothingMode.AntiAlias`使边缘平滑
- 半透明边框:使用带透明度的颜色值(如`Color.FromArgb(150, ...)`)
3. **性能优化**:
- 双缓冲技术:`DoubleBuffered = true`防止闪烁
- 资源管理:使用`using`语句自动释放`Pen`和`Brush`资源
- 定时器控制:`Timer`控制动画帧率
#### 扩展图案示例:
```csharp
// 绘制分形雪花(递归实现)
private void DrawKochSnowflake(Graphics g, PointF p1, PointF p5, int depth)
{
if (depth == 0)
{
g.DrawLine(Pens.Blue, p1, p5);
return;
}
float dx = (p5.X - p1.X) / 3;
float dy = (p5.Y - p1.Y) / 3;
PointF p2 = new PointF(p1.X + dx, p1.Y + dy);
PointF p4 = new PointF(p1.X + 2 * dx, p1.Y + 2 * dy);
// 计算等边三角形的第三个顶点
PointF p3 = new PointF(
(p1.X + p5.X) / 2 - dy * (float)Math.Sin(Math.PI / 3),
(p1.Y + p5.Y) / 2 + dx * (float)Math.Sin(Math.PI / 3)
);
DrawKochSnowflake(g, p1, p2, depth - 1);
DrawKochSnowflake(g, p2, p3, depth - 1);
DrawKochSnowflake(g, p3, p4, depth - 1);
DrawKochSnowflake(g, p4, p5, depth - 1);
}
```
#### 几何绘制技巧:
1. **坐标变换**:
```csharp
Matrix transform = new Matrix();
transform.RotateAt(rotationAngle, new PointF(centerX, centerY));
g.Transform = transform;
```
2. **渐变填充**:
```csharp
using (LinearGradientBrush gradient = new LinearGradientBrush(
new Point(0, 0),
new Point(200, 200),
Color.Red,
Color.Blue))
{
g.FillPolygon(gradient, points);
}
```
3. **路径组合**:
```csharp
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(50, 50, 200, 200);
path.AddRectangle(new Rectangle(100, 100, 100, 100));
g.FillPath(Brushes.Gold, path);
}
```
> 提示:对于复杂几何图案,建议使用`GraphicsPath`对象组合基本形状,再统一绘制[^1][^4]。性能敏感场景可考虑预渲染到位图:`Bitmap buffer = new Bitmap(width, height);`[^2]