Помогите с рендерингом набора Мандельброта в Java - PullRequest
2 голосов
/ 27 апреля 2010

Я написал реализацию набора Мандельброта в Java с использованием JComponent, но я получаю странные результаты при его рендеринге. Кроме того, все компилируется правильно. Я просто не уверен, что я делаю это неправильно. Любой обзор кода также будет оценен.

Мой источник размещен на pastebin, так как он занял бы здесь слишком много места:

JMandelbrot.java Mandelbrat.java

Ответы [ 3 ]

4 голосов
/ 27 апреля 2010

Проблема:

  • Изображение, как я ожидаю от кода. Набор Мандельброта имеет диаметр 2, поэтому в центре вы видите только несколько пикселей.

Решение:

  • Измените метод renderPoint, чтобы он принимал double аргументы, и назовите его как renderPoint((x - h)/100.0, (k - y)/100.0), чтобы увидеть что-то более интересное.
  • Измените количество итераций и цветовое кодирование, потому что теперь вы вычисляете 255 ^ 3 итераций для каждого внутреннего пикселя. Мне удалось увидеть что-то приятное, изменив возврат renderPoint на return (((r << 16) | (g << 8) | b)<<4) и установив MaxColorBit = 16.

Обзор кода:

  • (int)Math.floor(Width / 2) можно заменить на Width / 2, потому что это целочисленное деление.
  • Вы должны начинать свои атрибуты Width и Height со строчных букв (width и height), потому что это соглашение Java, которое помогает дифференцировать классы и атрибуты.
  • Атрибут iterations не используется.
2 голосов
/ 27 апреля 2010
  • Вы правильно рисуете фрактал, но он действительно маленький. Весь набор Мандельброта вписывается в круг радиуса 2, поэтому он едва покрывает несколько пикселей в середине окна 400x500.

    Вы должны разработать какое-то отображение из окна экрана (которое идет от (0,0) до (width,height)) к комплексной плоскости, которая должна иметь значения в окрестности от -2-2i до 2+2i или около того. Быстрым решением было бы разделить выражения x-h и k-y на 100 перед передачей их в renderPoint и изменением аргументов renderPoint с int на double. Лучше всего указать желаемый прямоугольник просмотра и использовать его для определения соответствия.

  • Вы вычисляете фрактальное изображение в потоке GUI. Это нет-нет, так как приложение будет зависать до завершения открытия окна. Я бы изменил вызов render() в конструкторе, чтобы он выглядел так:

    new Thread() {
      public void run() { render(); }
    }.start();
    
0 голосов
/ 19 апреля 2011

Взгляните на этот пример фрактального рендеринга Мандельброта с использованием Marvin: http://marvinproject.sourceforge.net/en/plugins/mandelbrot.html

Существует также плагин для рендеринга набора Юлии: http://marvinproject.sourceforge.net/en/plugins/juliaSet.html

...