Помогите с рендерингом множества Мандельброта в Java

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

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

JMandelbrot.java Мандельбрат.java


person SDLFunTimes    schedule 26.04.2010    source источник


Ответы (3)


Проблема:

  • Изображение такое, как я ожидаю от кода. Множество Мандельброта имеет диаметр 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 не используется.
person Christian Semrau    schedule 26.04.2010
comment
Большое Вам спасибо. Однако можете ли вы объяснить дополнительный сдвиг на 4 в обратной линии? - person SDLFunTimes; 27.04.2010
comment
Это был мой быстрый и грязный прием цветового кодирования, потому что иначе изображение было бы слишком темным, чтобы его можно было увидеть (попробуйте). Обычное цветовое кодирование выглядит следующим образом: Вычисляйте итерации до тех пор, пока не будет выполнено условие остановки или не будет достигнуто предопределенное количество итераций. Вы получаете количество фактически выполненных итераций. Это число используется в качестве индекса в таблице цветов (палитре). Палитра обычно содержит один или несколько плавных градиентов цветов. См. пример на commons.wikimedia.org/wiki/. - person Christian Semrau; 27.04.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();
    
person Josh Lee    schedule 26.04.2010
comment
+1 за предложение использовать отдельный поток. Но в этой ситуации repaint() должен быть запрошен после завершения render(), иначе вычисленное изображение не будет отображаться: public void run() { render(); repaint(); } - person Christian Semrau; 27.04.2010
comment
Да, хотя я бы поставил перекраску после окончания каждого ряда. - person Josh Lee; 27.04.2010

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

Существует также подключаемый модуль для рендеринга набора Джулии: http://marvinproject.sourceforge.net/en/plugins/juliaSet.html

person Joseph    schedule 19.04.2011