Милютина Лабораторные работа 4.ppt
- Количество слайдов: 41
Лабораторная работа 4 «Построение геометрических и динамических (алгебраических) фракталов »
Сценарий лабораторной работы 4. 1 Вывод изображения Тквадрата
Вероятно (? ), этот фрактал получил такое название за сходство с рейсшиной — линейкой с приделанной перпендикулярной планкой в виде буквы Т. По-английски этот инструмент так и называется — T-square.
Построение начинается с единичного квадрата. Первый шаг: закрасить в центре белым цветом квадрат со стороной 1/2. Затем нужно мысленно разделить квадрат на 4 одинаковых квадрата и в центре каждого из них закрасить квадрат со стороной 1/4. Дальше каждый из этих 4 квадратов снова делится на 4 части, всего получится 16 квадратиков, и с каждым из них нужно проделать то же самое.
Порядок кодирования 1. Подключить заголовочный файл библиотеки glut. 2. Добавить функцию перерисовки окна. void reshape(int w, int h) Включающую - Назначение цвета заливки буфера кадра - Описание окна вывода (параметры 0, 0. w, h)
-Определить проекционную матрицу - Инициализировать текущую матрицу в единичную - Определить ортографическую проекцию для вывода 2 D- изображения. -Определить видовую матрицу - Инициализировать текущую матрицу в единичную.
Код функции отрисовки void drow. T(int x, int y, int l, int it) { int X 1 = x - l / 2; //координаты вершин int X 2 = x + l / 2; int Y 1 = y - l / 2; int Y 2 = y + l / 2; gl. Color 3 f(0. 7 / it, 0. 7);
gl. Vertex 2 i(X 1, Y 1); gl. Vertex 2 i(X 1, Y 2); gl. Vertex 2 i(X 2, Y 1); if(it != 0){ drow. T(X 1, Y 1, l / 2, it - 1); //вызов рекурсии для каждой из вершин квадрата
drow. T(X 1, Y 2, l / 2, it - 1); drow. T(X 2, Y 2, l / 2, it - 1); drow. T(X 2, Y 1, l / 2, it - 1); } }
Ввести код функции
Код главной функции
Сценарий лабораторной работы 4. 2 Вывод изображения кривой Леви
Свойства Кривая Леви нигде не дифференцируема и не спрямляема. На любом интервале кривой Леви есть точки самопересечения. Хаусдорфова размерность кривой Леви приблизительно равна 1, 9340. Кривая Леви — крона дерева Пифагора.
Варианты: Скособоченная кривая получится, если вместо равнобедренного прямоугольного треугольника на каждом шаге использовать какойнибудь другой прямоугольный треугольник. в треугольнике.
С-кривую Леви можно построить, если начать не с отрезка, а с буквы П.
Остров Леви получается, если взять за основу квадрат:
Алгоритм: На вход функции построения drow. Levi подаются координаты исходного отрезка и количество итераций; Если количество итераций равно 0 - рисуется отрезок по входным координатам; Иначе - находятся координаты точки излома и вызывается функция drow. Levi для каждого образовавшегося отрезка.
Порядок кодирования 1. Подключить заголовочный файл библиотеки glut. 2. Добавить код функции, реализующей адгоритм. 3. Добавить функцию перерисовки окна. void reshape(int w, int h)
//кривая Леви void drow. Levy(int x 1, int y 1, int x 2, int y 2, int i) { if(i == 0) { gl. Color 3 f(x 1 * 0. 01, x 2 * 0. 002, i * 0. 03); gl. Vertex 2 i(x 1, y 1); gl. Vertex 2 i(x 2, y 2); }
else { int x 3 = (x 1 + x 2) / 2 - (y 2 - y 1) / 2; //координаты int y 3 = (y 1 + y 2) / 2 + (x 2 - x 1) / 2; //точки излома drow. Levy(x 1, y 1, x 3, y 3, i - 1); drow. Levy(x 3, y 3, x 2, y 2, i - 1); } }
4. Добавить код функции void display(), включающей вызов функции drow. Levy. gl. Begin(GL_LINES); drow. Levy(300, 400, 500, 400, 15); //вызов функции вырисовки gl. End();
5. Добавить код функции int main(int argc, char *argv[]) Аналогичной примеру 4. 1 6. Отладить программу. 7. Выполнить индивидуальное задание.
Сценарий лабораторной работы 4. 3 Вывод изображения множества Мандельброта
Множеству Мандельброта принадлежат точки, которые в течение бесконечного числа итераций не уходят в бесконечность (точки, закрашенные в черный цвет).
Точки, принадлежащие границе множества (именно там возникает сложные структуры) уходят в бесконечность за конечное число итераций, а точки, лежащие за пределами множества, уходят в бесконечность через несколько итераций (белый фон).
//Программа демонстрирует построение множества Мандельброта при использовании Open. GL // и языка C++. Множество строится при запуске программы. //Для наглядности и краткости кода был реализован класс комплексных числе Complex.
#include <gl/glut. h> #include <math. h> double x, y; class Complex //класс комплексных чисел, необходимый для расчетов { private: double r, I;
#public: Complex(double r, double i) { this->r = r; this->i = i; } Complex operator+(const Complex &c) { return Complex(r + c. r, i + c. i); } Данные у каждого объекта свои, а функции класса общие для всех объектов, указатель this помогает, определить с данными какого объекта будет работать функция.
} Complex operator*(const Complex &c) { return Complex(r * c. r - i * c. i, 2 * r * c. i); } double abs(){return r * r + i * i; } };
void reshape(int w, int h) { gl. Viewport(0, 0, w, h); gl. Matrix. Mode(GL_PROJECTION ); gl. Load. Identity(); glu. Ortho 2 D(0, w, 0, h); gl. Matrix. Mode(GL_MODELVIEW) ; gl. Load. Identity(); }
void display() { gl. Clear(GL_COLOR_BUFFER_BIT); gl. Begin(GL_POINTS); for (int y = 0; y < 800; y++) //построение множества for (int x = 0; x < 1200; x++)
{ Complex z(0, 0); int i = 0; while (i < 500 && z. abs() < 16){ z = z * z + Complex((x - 600) / 180. 0, (y - 400) / 180. 0); i++; }
double r = 0. 1 + i * 0. 03 * 0. 2; //расчет double g = 0. 2 + i * 0. 03 * 0. 3; //значений double b = 0. 3 + i * 0. 03 * 0. 1; //для раски множества gl. Color 3 d(r, g, b); gl. Vertex 2 d(x, y); } gl. End(); glut. Swap. Buffers(); }
int main (int argc, char *argv[]) { glut. Init(&argc, argv); glut. Init. Display. Mode(GLUT_DOUBLE | GLUT_RGB); glut. Init. Window. Size(1200, 800); glut. Create. Window("Mandelbrot"); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Main. Loop(); }
Милютина Лабораторные работа 4.ppt