Материал: lab4

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторная работа № 4: Рисование фракталов

В следующих нескольких лабораторных работ вы создадите небольшое

JAVA-приложение, которое сможет рисовать фракталы. Если вы никогда не играли с фракталами раньше, вы будете удивлены тем, как просто можно создать красивые изображения. Это будет сделано с помощью фреймворка

Swing и Java API, который позволяет создавать графические пользовательские интерфейсы.

Начальная версия приложения будет довольно проста, но в следующих лабораторных работах будут добавлены некоторые полезные функции такие как, как сохранение сгенерированных изображений,

возможность переключения между различными видами фракталов. И

графический интерфейс (GUI), и механизм для поддержки различных фракталов будут зависеть от иерархий классов.

Вот простой пример графического интерфейса в его начальном состоянии:

Рисунок 5.2. Пример графического интерфейса И, вот некоторые интересные области фрактала: слоны и морские коньки!

Рисунок 5.3. Фрактал «Слоны»

Рисунок 5.4. Фрактал «Морские коньки»

Создание пользовательского интерфейса

Прежде чем рисовать фракталы, необходимо создать графический виджет, который будет их отображать. Swing не предоставляет такой компонент, но его очень просто создать самостоятельно. Обратите внимание на то, что в этой лабораторной работе мы будем использовать широкий спектр классов Java AWT и Swing, детали которых здесь будут не раскрыты. Для более подробной информации вы можете воспользоваться онлайн-документами по

API Java. Просто перейдите к пакету данного класса Java, выберите сам класс, а

затем прочтите подробную информацию о том, как использовать класс.

Создайте класс JImageDisplay, производный от

javax.swing.JComponent. Класса должен иметь одно поле с типом доступа private, экземпляп java.awt.image.BufferedImage. Класс BufferedImage управляет изображением, содержимое которого можно записать.

Конструктор JImageDisplay должен принимать целочисленные значения ширины и высоты, и инициализировать объект BufferedImage новым изображением с этой шириной и высотой, и типом изображения

TYPE_INT_RGB. Тип определяет, как цвета каждого пикселя будут

представлены в изображении; значение TYPE_INT_RGB обозначает, что красные, зеленые и синие компоненты имеют по 8 битов, представленные в формате int в указанном порядке.

Конструктор также должен вызвать метод setPreferredSize()

родительского класса метод с указанной шириной и высотой. (Вы должны будете передать эти значения в объект java.awt.Dimension) Таким образом,

когда ваш компонент будет включен в пользовательский интерфейс, он отобразит на экране все изображение.

Пользовательские компоненты Swing должны предоставлять свой собственный код для отрисовки, переопределяя защищенный метод JComponent paintComponent (Graphics g). Так как наш компонент просто выводит на экран данные изображения, реализация будет очень проста! Во-первых, нужно всегда вызывать метод суперкласса paintComponent (g) так, чтобы объекты отображались правильно. После вызова версии суперкласса, вы можете нарисовать изображение в компоненте, используя следующую операцию:

g.drawImage (image, 0, 0, image.getWidth(), image.getHeight(), null);

(Мы передаем значение null для ImageObserver, поскольку данная функциональность не требуется.)

Вы также должны создать два метода с доступом public для записи данных в изображение: метод clearImage (), который устанавливает все пиксели изображения в черный цвет (значение RGB 0), и метод drawPixel (int x, int y, int rgbColor), который устанавливает пиксель в определенный цвет. Оба метода будут необходимы для использования в методе setRGB () класса BufferedImage.

Не забывайте про комментарии!

Вычисления фрактала Мандельброта

Следующая ваша задача: написать код для вычисления фрактала Мандельброта.

Для создания фракталов используйте следующий исходный файл

FractalGenerator.java, от которого будут унаследованы все ваши фрактальные

генераторы. Как вы могли заметить данный файл предоставляет также некоторые полезные операции для перевода из экранных координат в систему координат вычисляемого фрактала.

Виды фракталов, с которыми нужно будет работать, вычисляются в комплексном виде и включают в себя простые математические функции,

которые выполняются многократно, пока не выполнится определенное условие.

Функция для фрактала Мандельброта имеет вид: zn = zn-12 + c, где все значения

— это комплексные числа, z0 = 0, и с - определенная точка фрактала, которую мы отображаем на экране. Вычисления повторяются до тех пор, пока |z| > 2

данной ситуации точка находится не во множестве Мандельброта), или пока число итераций не достигнет максимального значения, например, 2000 (в этом случае делается предположение, что точка находится в наборе).

Процесс построения фрактала Мандельброта прост: необходимо перебрать все пиксели изображения, рассчитать количество итераций для соответствующей координаты, и затем установить пиксель в цвет, основанный на количестве рассчитанных итераций. Все это будет сделано позже, на данном этапе необходимо реализовать приведенные выше вычисления.

Создайте подкласс FractalGenerator с именем Mandelbrot. в нем вам необходимо будет обеспечить только два метода: getInitialRange() и numIterations().

getInitialRange (Rectangle2D.Double) - метод позволяет генератору фракталов определить наиболее «интересную» область комплексной плоскости для конкретного фрактала. Обратите внимание на то, что методу в качестве аргумента передается прямоугольный объект, и метод должен изменить поля прямоугольника для отображения правильного начального диапазона для фрактала. (Пример можно увидеть в методе

FractalGenerator.recenterAndZoomRange().) В классе Mandelbrot этот метод должен установить начальный диапазон в (-2 - 1.5i) - (1 + 1.5i). Т.е. значения x

и y будут равны -2 и -1.5 соответственно, а ширина и высота будут равны 3.

Источник: https://studfile.net/preview/16448690/