我有一个绘制分形的方法
public static void DrawFractal(int x, int y, int len, double angle, PaintEventArgs e,Panel panel1)
{
Graphics g = e.Graphics;
double x1, y1;
x1 = x + len * Math.Sin(angle * Math.PI * 2 / 360.0);
y1 = y + len * Math.Cos(angle * Math.PI * 2 / 360.0);
g.DrawLine(new Pen(Color.Black), x, panel1.Height - y, (int)x1, panel1.Height - (int)y1);
if (len > 2)
{
DrawFractal((int)x1, (int)y1, (int)(len / 1.5), angle + 30, e,panel1);
DrawFractal((int)x1, (int)y1, (int)(len / 1.5), angle - 15, e,panel1);
}
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
FractalTree.DrawFractal(panel1.Width / 2, panel1.Height / 2, 80, 0, e, panel1);
}
现在这个方法在窗口打开时绘制。我希望它在单击按钮时绘制。
private void button2_Click(object sender, EventArgs e)
{
}
我还想添加稍后停止渲染的功能。因此,如果您能提出以下建议,我将非常高兴 处理与呈现相关的处理程序和事件。
[This是它看起来样子][1]:[https://i.stack.imgur.com/OGcC0.png2]:https://i.stack.imgur.com/mQeHc.png
1条答案
按热度按时间k2arahey1#
这里的主要问题是CPU绑定的操作。在UI线程中执行这种冗长的递归例程会冻结它,直到执行完成。因此,单击
Stop
按钮-正如您提到的-什么也不做。为了保持UI的响应性,创建方法的
Task
版本,在工作线程中运行它们,这样它们就可以等待完成或取消。绘制位图
在
Bitmap
上绘制图形,然后在Paint
事件中绘制。实作范例...
演示
绘制图形
使任务计算并返回定义形状的结构列表,并将其传递给相关的
Graphics.Draw...
或Graphics.Fill...
方法。...并按如下所示编辑实现示例...
这会产生一些漂亮而简单的动画: