Более быстрый метод для рисования в C # - PullRequest
3 голосов
/ 15 января 2012

Я пытаюсь нарисовать фрактал Мандельброта, используя следующий метод, который я написал:

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 , но этого недостаточно, SetPixel FastBitmap не увеличивает скорость рисования.Поэтому я ищу что-то очень быстрое, я знаю, что C # не похож на C и ASM, но было бы интересно сделать это в C# и Winforms.

Предложениядобро пожаловать.

РЕДАКТИРОВАТЬ: Мендельброт Set Zoom Animation

Ответы [ 2 ]

4 голосов
/ 15 января 2012

Я предполагаю, что было бы значительно эффективнее сначала заполнить ваши значения RGB в байтовом массиве в памяти, а затем записать их навалом в Bitmap, используя LockBits и Marshal.Copy (следуйтессылка для примера) и, наконец, нарисуйте растровое изображение, используя Graphics.DrawImage.

. Прежде чем вы сможете заставить его работать, вам необходимо понять некоторые важные понятия, такие как форматы шага и изображения.

2 голосов
/ 15 января 2012

Как сказано в комментарии, выведите CreateGraphics() из двойной петли, и это уже хорошее улучшение.

Но также

Интересную статью о CodeProject можно найти здесь .Это идет немного дальше, чем просто вызовы функций, объясняя на самом деле Matrix исчисление (простой способ, не волнуйтесь), что хорошо и не сложно понять, чтобы знать, что происходит за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...