Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言绘图的快速方法#_C#_Winforms - Fatal编程技术网

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值填充到内存中的字节数组中,然后使用and
marshall.Copy将它们批量写入
位图
(按照链接查看示例),最后使用
Graphics.DrawImage
绘制位图,效率会显著提高


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

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

而且

  • 启用双缓冲
  • 要进行缩放,请使用矩阵变换
函数,如:


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

我要做的第一件事是在循环之外创建图形对象。接下来,如果你能行的话,就是使用类似的东西在GPU上进行计算。真的很喜欢这个主意。那么你认为我可以添加XNA库并执行以下操作吗是在WinForms中吗?当你使用不安全的关键字时,C#就像C或ASM。谷歌“bitmap.lockbits pointers”。那么,在这种情况下,你的假设很可能是你的问题。使用分析器。很难看出它将如何告诉你除复杂以外的任何事情。Pow()这是您真正的瓶颈。它应该消耗99%的CPU时间。您列出的转换可能不适用于这种情况,因为需要转换的是复数平面上的坐标(也就是说,放大并没有使图像变大,它是用左上角和右下角的复数坐标(代码中为+2和-2)的差值来重新绘制的)。@geogeduckett:不知道OP所说的“放大”是什么意思,我指的是一种转换。这在嵌套循环中也很容易实现(如果必要的话)在渲染分形的上下文中,我假设缩放意味着渲染先前复杂平面的较小区域,而图形变换对此没有帮助。