用C#绘图的更快方法

本文关键字:方法 绘图 | 更新日期: 2023-09-27 18:20:16

我正试图用我写的以下方法绘制Mandelbrot分形:

public void Mendelbrot(int MAX_Iterations)
{
    int iterations = 0;
    for (float x = -2; x <= 2; x += 0.001f)
    {
        for (float y = -2; y <= 2; y += 0.001f)
        {
            Graphics gpr = panel.CreateGraphics();
            //System.Numerics
            Complex C = new Complex(x, y);
            Complex Z = new Complex(0, 0);
            for (iterations = 0; iterations < MAX_Iterations && Complex.Abs(Z) < 2; Iterations++)
                Z = Complex.Pow(Z, 2) + C;
            //ARGB color based on Iterations
            int r = (iterations % 32) * 7;
            int g = (iterations % 16) * 14;
            int b = (iterations % 128) * 2;
            int a = 255;
            Color c = Color.FromArgb(a,r,g,b);
            Pen p = new Pen(c);
            //Tranform the coordinates x(real number) and y(immaginary number) 
            //of the Gauss graph in x and y of the Cartesian graph
            float X = (panel.Width * (x + 2)) / 4;
            float Y = (panel.Height * (y + 2)) / 4;
            //Draw a single pixel using a Rectangle
            gpr.DrawRectangle(p, X, Y, 1, 1);
        }
    }
}

它工作,但它很慢,因为我需要添加缩放的可能性。使用这种绘图方法是不可能的,所以我需要一些快速的东西。我试着使用FastBitmap,但这还不够,FastBitmap的SetPixel并不能提高绘图速度。所以我正在快速搜索一些东西,我知道C#不像CASM,但在C#Winforms中这样做会很有趣。

欢迎提出建议。

编辑:Mendelbrot设置缩放动画

用C#绘图的更快方法

我认为,首先将RGB值填充到内存中的字节数组中,然后使用LockBitsMarshal.Copy将它们批量写入Bitmap(请参阅示例链接),最后使用Graphics.DrawImage绘制位图会更有效。

您需要了解一些基本概念,例如步幅和图像格式,然后才能使其发挥作用。

正如评论所说,将CreateGraphics()从双循环中取出,这已经是一个很好的改进。

还有

  • 启用双重缓冲
  • 对于缩放,使用MatrixTransformation功能,如:

    ScaleTransform

    旋转转换

    TranslateTransform

在这里可以找到一篇关于CodeProject的有趣文章。它比函数调用更进一步,通过实际解释Matrix演算(一种简单的方法,不用担心),这很好,也不难理解,以便了解幕后发生了什么。