用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#不像C
和ASM
,但在C#
和Winforms
中这样做会很有趣。
欢迎提出建议。
编辑:Mendelbrot设置缩放动画
我认为,首先将RGB值填充到内存中的字节数组中,然后使用LockBits
和Marshal.Copy
将它们批量写入Bitmap
(请参阅示例链接),最后使用Graphics.DrawImage
绘制位图会更有效。
您需要了解一些基本概念,例如步幅和图像格式,然后才能使其发挥作用。
正如评论所说,将CreateGraphics()
从双循环中取出,这已经是一个很好的改进。
还有
- 启用双重缓冲
-
对于缩放,使用
MatrixTransformation
功能,如:ScaleTransform
旋转转换
TranslateTransform
在这里可以找到一篇关于CodeProject的有趣文章。它比函数调用更进一步,通过实际解释Matrix
演算(一种简单的方法,不用担心),这很好,也不难理解,以便了解幕后发生了什么。