绘制分形使用Winform适合内部面板?

时间:2014-09-12 13:46:52

标签: c# .net winforms drawing

我正在尝试在.net中构建一个Windows应用程序,它在面板内绘制分形图像。它以行的终点作为下一行的起点。但问题是,图表是在面板之外。我怎么做修复面板内的绘图

        static int start_x, start_Y;
        static int end_x, end_Y;
        static int my_angle = 0;
        static int my_length = 0;

    private void Canvas_Paint(object sender, PaintEventArgs e)
    {
        start_x = Canvas.Width / 2;
        start_Y = Canvas.Height / 2;
        for (int i = 0; i < 400; i++)
        {
            draw_T();
        }
    }

    public void draw_T()
    {
       Pen mypen = new Pen(Color.Green, 2F);
        my_angle = my_angle + (45);
        my_length = 100 + (1);

        end_x = (int)(start_x + Math.Cos(my_angle * .0174539676) * my_length);

        end_Y = (int)(start_Y + Math.Sin(my_angle * .0174539676) * my_length);

        Point[] points =
        {
            new Point (start_x,start_Y),
            new Point (end_x,end_Y)
        };
        Point[] points1 =
        {
            new Point ((end_x+start_x)/2,(end_Y+start_Y)/2),
            new Point (end_x+50,end_Y-100)
        };
        start_x = end_x;
        start_Y = end_Y;
        Graphics g = Canvas.CreateGraphics();
        g.DrawLines(mypen, points);
        g.DrawLines(mypen, points1);
    }

1 个答案:

答案 0 :(得分:0)

我不确定你的图形应该如何看,但我可以给你一些提示。

一般来说,首先:请使用e.Graphics参数!改变

public void draw_T()

public void draw_T(Graphics g)

并删除该行。

Graphics g = Canvas.CreateGraphics();

将通话更改为

draw_T(e.Graphics);

您正在通过创建处理它们的所有Graphcs来泄漏GDI资源,并且当您已经拥有Paint事件中的那个时,通过创建它们来浪费时间。

接下来,您应该添加NumericUpDown来测试您的算法并编写如下脚本:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    Canvas.Invalidate();
}

要工作,现在将循环更改为

for (int i = 0; i < numericUpDown1.Value; i++)

观看你的图形发展。

另一个测试可能是为第二个系列点引入第二笔颜色。 要进一步发挥作用,您可以添加另一个NumericUpDown并将my_length绑定到它..

最后你会看到长度需要小于101,否则画布需要大到700像素。

BTW:my_anglemy_length都不需要在类级别声明,因为它们总是在方法中设置并且在其他任何地方都没有使用,其他变量也不需要static,at至少从你向我们展示的......