По заданным параметрам построить фрактал Курликю.
Под примером прикреплен архив проекта со галереей скриншотов.
Первый параметр (обозначается буквой r) - длина кривой Корню, на основе которой строиться фрактал. В некотором смысле - это масштаб изображения.
Второй параметр (обозначается буквой t) - показатель степени, в которую мы возводим некоторое число v, которое мы будем перебирать в цикле (изменение этого параметра сильно влияет на угол поворота кривой)
Третий параметр (обозначается буквой s) - множитель, на который мы умножаем величину pow(v, t). Это позволяет нам регулировать угол поворота кривой Корню более точно, чем второй параметр.
Третий параметр (обозначается буквой step) - это шаг цикла (шаг изменения основания степени vt.
Для лучшего понимания взаимосвязи этих параметров давайте рассмотрим формулы, по которым вычисляется следующая точка для прорисовки фрактала:
double w = s * Math.pow(v, t); // вычисляем угол, на который нам нужно повернуть кривую Корню (элементарноя составляющая фрактала)
X2 = (int) (X1 + r * Math.cos(w)); // координаты следующей точки фрактала
Y2 = (int) (Y1 + r * Math.sin(w));
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Graphics gr = canvas1.getGraphics(); // Инициализируем графику Graphics2D g = (Graphics2D)gr; // Конвертируем графику в класс Graphics2D (необходимо для редактирования стиля кисти) g.setStroke(new BasicStroke(1.5f)); // Устанавливаем толщину кисти int DrawWidth = 10; // толщина рисуемой линии int xmax = 300; // сдвиг системы координат к центру формы int ymax = 300; String str = jFormattedTextField1.getText(); // записываем значение первого поля ввода в строку double r = Double.parseDouble(str); // длина одного участка, масштаб рисунка (чем больше число, тем больше рисунок) str = jFormattedTextField3.getText(); // записываем значение третьего поля ввода в строку double s = Double.parseDouble(str); // второй параметр (дополнительный коэффициент) коэффицинет str = jFormattedTextField2.getText(); // записываем значение второго поля ввода в строку double t = Double.parseDouble(str); // показатель степени str = jFormattedTextField4.getText(); // записываем значение второго поля ввода в строку double step = Integer.parseInt(str); // показатель степени int X1 = 0; // Координаты начальной точки для рисования int Y1 = 100; g.clearRect(0, 0, 700, 700); // Очищаем область для рисования for (int v = -10000; v <= 10000; v += step) { double w = s * Math.pow(v, t); // вычисляем угол int X2 = (int) (X1 + r * Math.cos(w)); // координаты int Y2 = (int) (Y1 + r * Math.sin(w)); // координаты int red = Math.abs(v/4 + 1024) % 255; // по счетчику цикла определяем цвет рисования линии (содержание красного цвета) int green = Math.abs(255 - v/3) % 255; // по счетчику цикла определяем цвет рисования линии (содержание зеленого цвета) int blue = Math.abs(128 - v) % 255; // по счетчику цикла определяем цвет рисования линии (содержание синего цвета) g.setColor(new Color(red, green, blue)); // Определяем цвет в классе Graphics g.drawLine(X1 + xmax, Y1 + ymax, X2+xmax, Y2+ymax); // Рисуем отрезок X1 = X2; Y1 = Y2; // Текущую точку делаем предыдущей } }
Прикрепленный файл | Размер |
---|---|
Curlicue_fractal.rar | 908.15 кб |