C# C语言绘图的快速方法#
我试图用我写的以下方法绘制曼德布罗特分形:C# C语言绘图的快速方法#,c#,winforms,C#,Winforms,我试图用我写的以下方法绘制曼德布罗特分形: 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.CreateGraph
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);
}
}
}
public void Mendelbrot(int MAX_迭代次数)
{
int迭代次数=0;
对于(float x=-2;x,我假设首先将RGB值填充到内存中的字节数组中,然后使用andmarshall.Copy将它们批量写入位图(按照链接查看示例),最后使用Graphics.DrawImage
绘制位图,效率会显著提高
您需要了解一些基本概念,例如步幅和图像格式,然后才能使其生效。如评论所述,将CreateGraphics()
从双循环中推出,这已经是一个很好的改进
而且
- 启用双缓冲
- 要进行缩放,请使用矩阵变换
函数,如:
可以找到一篇关于CodeProject的有趣文章。它比函数调用更进一步,通过实际解释矩阵微积分(一种简单的方法,不用担心),这很好,也不难理解,以便了解幕后发生了什么。我要做的第一件事是在循环之外创建图形对象。接下来,如果你能行的话,就是使用类似的东西在GPU上进行计算。真的很喜欢这个主意。那么你认为我可以添加XNA库并执行以下操作吗是在WinForms中吗?当你使用不安全的关键字时,C#就像C或ASM。谷歌“bitmap.lockbits pointers”。那么,在这种情况下,你的假设很可能是你的问题。使用分析器。很难看出它将如何告诉你除复杂以外的任何事情。Pow()这是您真正的瓶颈。它应该消耗99%的CPU时间。您列出的转换可能不适用于这种情况,因为需要转换的是复数平面上的坐标(也就是说,放大并没有使图像变大,它是用左上角和右下角的复数坐标(代码中为+2和-2)的差值来重新绘制的)。@geogeduckett:不知道OP所说的“放大”是什么意思,我指的是一种转换。这在嵌套循环中也很容易实现(如果必要的话)在渲染分形的上下文中,我假设缩放意味着渲染先前复杂平面的较小区域,而图形变换对此没有帮助。