我有一个方法,绘制分形每以下片段:
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 is how it will look like][1]: https://i.stack.imgur.com/OGcC0.png [2]: https://i.stack.imgur.com/mQeHc.png
1条答案
按热度按时间jecbmhm31#
这里的主要问题是CPU绑定操作。在UI线程中执行这种冗长的递归例程会冻结它,直到执行完成。因此,单击
Stop
按钮-正如您提到的-什么也不会做。要保持UI的响应性,请创建方法的
Task
版本,以便在工作线程中运行它们,这样就可以等待它们完成或取消。绘制位图
在
Bitmap
上绘制形状,然后在Paint
事件中绘制。实现示例...
演示
画出形状
让任务计算并返回定义形状的结构列表,并将它们传递给相关的
Graphics.Draw...
或Graphics.Fill...
方法。...并按如下所示编辑实现示例...
它会生成一些漂亮而简单的动画: