initial commit
This commit is contained in:
		
						commit
						2369f801af
					
				
					 76 changed files with 4273 additions and 0 deletions
				
			
		
							
								
								
									
										189
									
								
								seminar01_overload/homework/code/complex.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								seminar01_overload/homework/code/complex.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,189 @@ | |||
| #pragma once | ||||
| #include <cmath> | ||||
| #include <iostream> | ||||
| 
 | ||||
| struct Complex { | ||||
|     float re; | ||||
|     float im; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Передаёмм аргументы через ссылки
 | ||||
| // В данном случае можно было передавать по значению 
 | ||||
| // (так как Complex имеет малый размер)
 | ||||
| // Но в общем случае лучше для структур лучше
 | ||||
| // всегда использовать ссылки 
 | ||||
| 
 | ||||
| Complex operator+(const Complex& a, const Complex& b) { | ||||
|     Complex result = {a.re + b.re, a.im + b.im}; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex operator-(const Complex& a, const Complex& b) { | ||||
|     Complex result = {a.re - b.re, a.im - b.im}; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex operator*(const Complex& a, const Complex& b) { | ||||
|     Complex result = {a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re}; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex operator/(const Complex& a, const Complex& b) { | ||||
|     float b_squared = b.re * b.re + b.im * b.im; | ||||
|     | ||||
|     Complex result; | ||||
|     result.re = (a.re * b.re + a.im * b.im) / b_squared; | ||||
|     result.im = (a.im * b.re - a.re * b.im) / b_squared; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex& operator+=(Complex &a, const Complex &b) { | ||||
|     a.re += b.re; | ||||
|     a.im += b.im; | ||||
|     return a; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Унарный оператор -
 | ||||
| // То есть если z - комплексное число x + iy, то -z = - x - iy
 | ||||
| Complex operator-(const Complex& a) { | ||||
|     Complex result; | ||||
|     result.re = -a.re; | ||||
|     result.im = -a.im; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Унарный оператор +
 | ||||
| // Ничего не меняет
 | ||||
| Complex operator+(const Complex& a) { | ||||
|     Complex result = a; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Унарный оператор *
 | ||||
| // То есть если z - комплексное число x + iy, то *z = x - iy
 | ||||
| // Оператор сопряжения
 | ||||
| Complex operator*(const Complex& a) { | ||||
|     Complex result; | ||||
|     result.re =  a.re; | ||||
|     result.im = -a.im; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Число + комплексное число (в таком порядке)
 | ||||
| Complex operator+(float a, const Complex& b) { | ||||
|     Complex result = b; | ||||
|     result.re += a; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Комплексное число + число
 | ||||
| Complex operator+(const Complex& a, float b) { | ||||
|     Complex result = a; | ||||
|     result.re += b; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Число - комплексное число (в таком порядке)
 | ||||
| Complex operator-(float a, const Complex& b) { | ||||
|     Complex result = -b; | ||||
|     result.re += a; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Комплексное число - число
 | ||||
| Complex operator-(const Complex& a, float b) { | ||||
|     Complex result = a; | ||||
|     result.re -= b; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| // Комплексное число * число
 | ||||
| Complex operator*(const Complex& a, float b) { | ||||
|     Complex result = a; | ||||
|     result.re *= b; | ||||
|     result.im *= b; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Число * комплексное число
 | ||||
| Complex operator*(float a, const Complex& b) { | ||||
|     Complex result = b; | ||||
|     result.re *= a; | ||||
|     result.im *= a; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Комплексное число / число
 | ||||
| Complex operator/(const Complex& a, float b) { | ||||
|     Complex result = a; | ||||
|     result.re /= b; | ||||
|     result.im /= b; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| // Число / комплексное число
 | ||||
| Complex operator/(float a, const Complex& b) { | ||||
|     float b_squared = b.re * b.re + b.im * b.im; | ||||
|     return (a * (*b)) / b_squared; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Перегружаем оператор<< между типами 
 | ||||
| // std::ostream (такой тип имеет std::cout) и Complex
 | ||||
| // Обратите внимание, что мы возвращаем ссылку на ostream
 | ||||
| // Таким образом результатом выражения  cout << a  будет cout
 | ||||
| // Поэтому можно делать так: cout << a << b << c ...
 | ||||
| std::ostream& operator<<(std::ostream& out, const Complex& a) { | ||||
|     if (a.re != 0) | ||||
|         out << a.re; | ||||
| 
 | ||||
|     if (a.im > 0) { | ||||
|         if (a.im != 1.0) | ||||
|             out << " + " << a.im << "i"; | ||||
|         else | ||||
|             out << " + i"; | ||||
|     } | ||||
|     else if (a.im < 0) { | ||||
|         if (a.im != -1.0) | ||||
|             out << " - " << -a.im << "i"; | ||||
|         else | ||||
|             out << " - i"; | ||||
|     } | ||||
|     return out; | ||||
| } | ||||
| 
 | ||||
| std::istream& operator>>(std::istream& in, Complex& c) { | ||||
|     in >> c.re >> c.im; | ||||
|     return in; | ||||
| } | ||||
| 
 | ||||
| float abs(const Complex& a) { | ||||
|     return sqrtf(a.re * a.re + a.im * a.im); | ||||
| } | ||||
| 
 | ||||
| Complex exp(const Complex& a) { | ||||
|     Complex result; | ||||
|     result.re = expf(a.re) * cosf(a.im); | ||||
|     result.im = expf(a.re) * sinf(a.im); | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex sin(const Complex& a) { | ||||
|     Complex result; | ||||
|     result.re = sinf(a.re) * coshf(a.im); | ||||
|     result.im = cosf(a.re) * sinhf(a.im); | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| Complex cos(const Complex& a) { | ||||
|     Complex result; | ||||
|     result.re = cosf(a.re) * coshf(a.im); | ||||
|     result.im = sinf(a.re) * sinhf(a.im); | ||||
|     return result; | ||||
| } | ||||
							
								
								
									
										56
									
								
								seminar01_overload/homework/code/complex_image.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								seminar01_overload/homework/code/complex_image.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| #include <cstdio> | ||||
| #include <cstdlib> | ||||
| #include <cmath> | ||||
| #include "complex.h" | ||||
| using namespace std; | ||||
| 
 | ||||
| // В этой программе мы рисуем в картинку комплексную функцию,
 | ||||
| // которая задаётся в функции func
 | ||||
| 
 | ||||
| struct Color { | ||||
| 	unsigned char r, g, b; | ||||
| }; | ||||
| 
 | ||||
| Complex func(Complex z) { | ||||
| 	Complex f = 100/(z - 1)*exp(z); | ||||
| 	f.re = fabs(f.re); | ||||
| 	f.im = fabs(f.im); | ||||
| 	if (f.re > 255) | ||||
| 		f.re = 255; | ||||
| 	if (f.im > 255) | ||||
| 		f.im = 255; | ||||
| 	return f; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main() { | ||||
| 	int width = 800, height = 800; | ||||
| 	float x0 = -2.0f, x1 = 2.0f; | ||||
| 	float y0 = -2.0f, y1 = 2.0f; | ||||
| 	 | ||||
| 	// Выделяем память под пиксели
 | ||||
| 	Color* data = (Color*)malloc(sizeof(Color) * width * height); | ||||
| 
 | ||||
| 	// data - это массив цветов размером width * height
 | ||||
| 	// Задаём значения этого массива так, чтобы
 | ||||
| 	// реальная часть функции func соответствовала зелёному цвету,
 | ||||
| 	// а мнимая часть -- синей компоненте цвета
 | ||||
| 	for (int j = 0; j < height; j++) { | ||||
| 		for (int i = 0; i < width; i++) { | ||||
| 			Complex z = {x0 + (x1-x0) / width * i, y0 + (y1-y0) / width * j}; | ||||
| 			Complex f = func(z); | ||||
| 			data[i + width * j].r = 0; | ||||
| 			data[i + width * j].g = f.re; | ||||
| 			data[i + width * j].b = f.im; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Сохраняем массив цветов data как картинку в формате .ppm
 | ||||
| 	FILE* file = fopen("complex_image.ppm", "wb"); | ||||
| 	fprintf(file, "P6\n%d %d\n255\n", width, height); | ||||
| 	fwrite(data, sizeof(Color), height * width, file); | ||||
| 	fclose(file); | ||||
| 
 | ||||
| 	// Освобождаем память
 | ||||
| 	free(data); | ||||
| } | ||||
							
								
								
									
										63
									
								
								seminar01_overload/homework/code/complex_movie.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								seminar01_overload/homework/code/complex_movie.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | |||
| #include <cstdio> | ||||
| #include <cstdlib> | ||||
| #include <cmath> | ||||
| #include "complex.h" | ||||
| using namespace std; | ||||
| 
 | ||||
| // Это программа создаёт анимацию (набор картинок)
 | ||||
| // которая задаётся как меняющееся во времени
 | ||||
| // комплексная функция (описана в функции func)
 | ||||
| 
 | ||||
| 
 | ||||
| struct Color { | ||||
| 	unsigned char r, g, b; | ||||
| }; | ||||
| 
 | ||||
| Complex func(Complex z, int time) { | ||||
| 	Complex f = 100/(z - (0.02f*time))*exp(z*sin(z)); | ||||
| 	f.re = fabs(f.re); | ||||
| 	f.im = fabs(f.im); | ||||
| 	if (f.re > 255) | ||||
| 		f.re = 255; | ||||
| 	if (f.im > 255) | ||||
| 		f.im = 255; | ||||
| 	return f; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int main() { | ||||
| 	int width = 800, height = 800; | ||||
| 	float x0 = -2.0f, x1 = 2.0f; | ||||
| 	float y0 = -2.0f, y1 = 2.0f; | ||||
| 	Color* data = (Color*)malloc(sizeof(Color) * width * height); | ||||
| 
 | ||||
| 	// Повторяем 200 раз
 | ||||
| 	int max_time_steps = 200; | ||||
| 	for (int time = 0; time < max_time_steps; time++) | ||||
| 	{ | ||||
| 		// Задаём изображение в массиве data
 | ||||
| 		for (int j = 0; j < height; j++) | ||||
| 		{ | ||||
| 			for (int i = 0; i < width; i++) | ||||
| 			{ | ||||
| 				Complex z = {x0 + (x1-x0) / width * i, y0 + (y1-y0) / width * j}; | ||||
| 				Complex f = func(z, time); | ||||
| 				data[i + width * j].r = 0; | ||||
| 				data[i + width * j].g = f.re; | ||||
| 				data[i + width * j].b = f.im; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Создаём в строке filename имя изображения
 | ||||
| 		// Папка animation должна существовать!
 | ||||
| 		char filename[100]; | ||||
| 		sprintf(filename, "animation/complex_%03d.ppm", time); | ||||
| 
 | ||||
| 		// Сохраняем изображение в картинке по имени filename
 | ||||
| 		FILE* file = fopen(filename, "wb"); | ||||
| 		fprintf(file, "P6\n%d %d\n255\n", width, height); | ||||
| 		fwrite(data, sizeof(Color), height * width, file); | ||||
| 		fclose(file); | ||||
| 	} | ||||
| 	free(data); | ||||
| } | ||||
							
								
								
									
										38
									
								
								seminar01_overload/homework/code/complex_test.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								seminar01_overload/homework/code/complex_test.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | |||
| #include <iostream> | ||||
| #include "complex.h" | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| // Тут мы тестируем нашу реализацию комплексных чисел
 | ||||
| 
 | ||||
| int main() { | ||||
|     Complex a; | ||||
|     Complex b; | ||||
|      | ||||
|     cin >> a >> b; | ||||
| 
 | ||||
|     cout << "a      = "  << a      << endl  | ||||
|          << "b      = "  << b      << endl  | ||||
|          << "a + b  = "  << a + b  << endl  | ||||
|          << "a - b  = "  << a - b  << endl  | ||||
|          << "a * b  = "  << a * b  << endl  | ||||
|          << "a / b  = "  << a / b  << endl  | ||||
|          << "-a     = "  << -a     << endl  | ||||
|          << "+a     = "  << +a     << endl  | ||||
|          << "*a     = "  << *a     << endl | ||||
|          << "a + 5  = "  << a + 5  << endl | ||||
|          << "5 + a  = "  << 5 + a  << endl | ||||
|          << "a * 5  = "  << a * 5  << endl | ||||
|          << "5 * a  = "  << 5 * a  << endl | ||||
|          << "Exp(a) = "  << exp(a) << endl | ||||
|          << "Sin(a) = "  << sin(a) << endl | ||||
|          << "Cos(a) = "  << cos(a) << endl | ||||
|          << "Exp((a + b) / a) * Cos(a - b) = "  << exp((a + b) / a) * cos(a - b) << endl; | ||||
| 
 | ||||
|     a += b; | ||||
|     cout << "a += b; a = " << a << endl; | ||||
| 
 | ||||
|     // Оператор = мы не перегружали, но это всё равно работает
 | ||||
|     b = a; | ||||
|     cout << "b = a; b = " << b << endl; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								seminar01_overload/homework/homework_overload.pdf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								seminar01_overload/homework/homework_overload.pdf
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										160
									
								
								seminar01_overload/homework/homework_overload.tex
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								seminar01_overload/homework/homework_overload.tex
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,160 @@ | |||
| \documentclass{article} | ||||
| \usepackage[utf8x]{inputenc} | ||||
| \usepackage{ucs} | ||||
| \usepackage{amsmath}  | ||||
| \usepackage{amsfonts} | ||||
| \usepackage{marvosym} | ||||
| \usepackage{wasysym} | ||||
| \usepackage{upgreek} | ||||
| \usepackage[english,russian]{babel} | ||||
| \usepackage{graphicx} | ||||
| \usepackage{float} | ||||
| \usepackage{textcomp} | ||||
| \usepackage{hyperref} | ||||
| \usepackage{geometry} | ||||
|   \geometry{left=2cm} | ||||
|   \geometry{right=1.5cm} | ||||
|   \geometry{top=1cm} | ||||
|   \geometry{bottom=2cm} | ||||
| \usepackage{tikz} | ||||
| \usepackage{ccaption} | ||||
| \usepackage{multicol} | ||||
| 
 | ||||
| \usepackage{listings} | ||||
| %\setlength{\columnsep}{1.5cm} | ||||
| %\setlength{\columnseprule}{0.2pt} | ||||
| 
 | ||||
| \usepackage{colortbl,graphicx,tikz} | ||||
| \definecolor{X}{rgb}{.5,.5,.5} | ||||
| 
 | ||||
| \title{ДЗ. Работа с изображениями в формате \texttt{.ppm}} | ||||
| \date{} | ||||
| \begin{document} | ||||
| \pagenumbering{gobble} | ||||
| 
 | ||||
| \lstset{ | ||||
|   language=C++,                % choose the language of the code | ||||
|   basicstyle=\linespread{1.1}\ttfamily, | ||||
|   columns=fixed, | ||||
|   fontadjust=true, | ||||
|   basewidth=0.5em, | ||||
|   keywordstyle=\color{blue}\bfseries, | ||||
|   commentstyle=\color{gray}, | ||||
|   stringstyle=\ttfamily\color{orange!50!black}, | ||||
|   showstringspaces=false, | ||||
|   %numbers=false,                   % where to put the line-numbers | ||||
|   numbersep=5pt, | ||||
|   numberstyle=\tiny\color{black}, | ||||
|   numberfirstline=true, | ||||
|   stepnumber=1,                   % the step between two line-numbers.         | ||||
|   numbersep=10pt,                  % how far the line-numbers are from the code | ||||
|   backgroundcolor=\color{white},  % choose the background color. You must add \usepackage{color} | ||||
|   showstringspaces=false,         % underline spaces within strings | ||||
|   captionpos=b,                   % sets the caption-position to bottom | ||||
|   breaklines=true,                % sets automatic line breaking | ||||
|   breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace | ||||
|   xleftmargin=.2in, | ||||
|   extendedchars=\true, | ||||
|   keepspaces = true, | ||||
| } | ||||
| \lstset{literate=% | ||||
|    *{0}{{{\color{red!20!violet}0}}}1 | ||||
|     {1}{{{\color{red!20!violet}1}}}1 | ||||
|     {2}{{{\color{red!20!violet}2}}}1 | ||||
|     {3}{{{\color{red!20!violet}3}}}1 | ||||
|     {4}{{{\color{red!20!violet}4}}}1 | ||||
|     {5}{{{\color{red!20!violet}5}}}1 | ||||
|     {6}{{{\color{red!20!violet}6}}}1 | ||||
|     {7}{{{\color{red!20!violet}7}}}1 | ||||
|     {8}{{{\color{red!20!violet}8}}}1 | ||||
|     {9}{{{\color{red!20!violet}9}}}1 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| \title{Семинар \#1: Ссылки и перегрузка операторов. Домашнее задание.\vspace{-5ex}}\date{}\maketitle | ||||
| \subsection*{Пространство имён:} | ||||
| \begin{itemize} | ||||
| \item Создайте пространство имён по имени \texttt{myspace}. В этом пространстве имён создайте функцию \\ | ||||
|  \texttt{void print\_n\_times(char str[], int n = 10)}, которая будет печатать строку \texttt{str} \texttt{n} раз. Для печати используйте \texttt{std::cout} из библиотеки \texttt{iostream}. Вызовите эту функцию из \texttt{main}. | ||||
| \end{itemize} | ||||
| 
 | ||||
| \subsection*{Ссылки:} | ||||
| \begin{itemize} | ||||
| \item Напишите функцию \texttt{cube}, которая будет принимать одно число типа \texttt{int} и возводить его в куб. Используйте ссылки. Вызовите эту функцию из функции \texttt{main}. | ||||
| \item Напишите функцию \texttt{void count\_letters(char str[], int\& n\_letters, int\& n\_digits, int\& n\_other)}, которая будет принимать на вход строку \texttt{str} и подсчитывать число букв и цифр в этой строке. Количество букв нужно записать в переменную \texttt{n\_letters}, количество цифр -- в переменную \texttt{n\_digits}, а количество остальных символов -- в переменную \texttt{n\_other}. Вызвать эту функцию из функции \texttt{main}. | ||||
| \end{itemize} | ||||
| 
 | ||||
| \subsection*{Перегрузка операций:} | ||||
| В файлах \texttt{code/complex.h} и \texttt{code/complex.cpp} лежит реализация комплексного числа с перегруженными операторами. Используйте его в качестве примера для решения задач этого раздела: | ||||
| \begin{itemize} | ||||
| \item Создайте структуру \texttt{Vector3f} - вектор в трёхмерном пространстве с полями \texttt{x, y, z} типа \texttt{float} в качестве координат. Перегрузите следующие операторы для работы с вектором. Для передачи вектора в функции используте ссылки и, там где возможно, модификатор \texttt{const}. | ||||
| 	\begin{itemize} | ||||
| 	\item Сложение векторов (\texttt{+}) | ||||
| 	\item Вычитание (\texttt{-}) | ||||
| 	\item Умножение вектора на число типа \texttt{float} (число \texttt{*} вектор и вектор \texttt{*} число) | ||||
| 	\item Деление вектора на число типа \texttt{float} (вектор \texttt{/} число) | ||||
| 	\item Скалярное произведение (\texttt{*}) | ||||
| 	\item Унарный \texttt{-} | ||||
| 	\item Унарный \texttt{+} | ||||
| 	\item Проверка на равенство \texttt{==}  (должна возвращать тип \texttt{bool}) | ||||
| 	\item Проверка на неравенство \texttt{!=}  (должна возвращать тип \texttt{bool}) | ||||
| 	\item Операторы \texttt{+=} и \texttt{-=}  (вектор \texttt{+=} вектор) | ||||
| 	\item Операторы \texttt{*=} и \texttt{/=}  (вектор \texttt{*=} число) | ||||
| 	\item Оператор вывода  \texttt{ostream >{}>} вектор. Выводите вектор в виде \texttt{(x, y, z)}. | ||||
| 	\item Оператор ввода  \texttt{istream <{}<} вектор | ||||
| 	\item Функция \texttt{float squared\_norm(const Vector3f\& a)}, которая вычисляет квадрат нормы вектора. | ||||
| 	\item Функция \texttt{float norm(const Vector3f\& a)}, которая вычисляет норму вектора. | ||||
| 	\item Функция \texttt{void normalize(Vector3f\& a)}, которая нормализует вектор \texttt{a}. | ||||
| 	\end{itemize} | ||||
| \item Поместите весь ваш код в отдельный файл \texttt{vector3f.h} и подключите к файлу \texttt{main.cpp}. | ||||
| \item Протестируйте ваши функции: | ||||
| \begin{lstlisting} | ||||
| #include <iostream> | ||||
| #include "vector3f.h" | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| 
 | ||||
| int main() { | ||||
| 	Vector3f a = {1.0, 2.0, -2.0}; | ||||
| 	Vector3f b = {4.0, -1.0, 3.0}; | ||||
| 	cout << "a = " << a << endl << "b = " << b << endl; | ||||
| 	cout << "a + b = " << a + b << endl; | ||||
| 	cout << "-a = " << -a << endl; | ||||
| 	cout << "Scalar product of a and b = " << a * b << endl; | ||||
| 	a /= 5; | ||||
| 	cout << "a after a /= 5;"  << a << endl | ||||
| 	normalize(b); | ||||
| 	cout << "Normalized b:"  << b << endl | ||||
| 	a += b; | ||||
| 	cout << "a after a+= b;" << a << endl; | ||||
| } | ||||
| \end{lstlisting} | ||||
| 
 | ||||
| \end{itemize} | ||||
| \subsection*{Задача об убегающей точке} | ||||
| \begin{itemize} | ||||
| \item Предположим, что у нас есть комплексная функция $f(z) = z^2$. Выберем некоторое комплексное число $z_0$ и будем проводить следующие итерации:  | ||||
| \begin{equation} | ||||
| \label{fractalseq} | ||||
| z_1 = f(z_0)\quad z_2 = f(z_1)\quad ...\quad z_{k+1} = f(z_k)\quad ... | ||||
| \end{equation} | ||||
| В зависимости от выбора точки $z_0$ эта последовательность либо разойдётся, либо останется в некоторой ограниченной области. Будем называть точку $z_0$ убегающей, если $z_k \rightarrow \infty$ при $k \rightarrow \infty$. Найдите область неубегания для функции $z^2$, т.е. множество всех начальных значений $z_0$, при которых последовательность (\ref{fractalseq}) остаётся ограниченной (это можно сделать в уме). \\ | ||||
| 
 | ||||
| \item \textbf{Julia:} Для функции $f(z) = z^2$ эта область тривиальна, но всё становится сложней для функции вида $f(z) = z^2 + c$, где $c$ -- некоторое комплексное число. Численно найдите область неубегания для функций такого вида. Для этого создайте изображение размера 800x800, покрывающую область \texttt{[-2:2]x[-2:2]} на комплексной плоскости. Для каждой точки этой плоскости проведите $N \approx 20$ итераций и, в зависимости от результата, окрасьте пиксель в соответствующий цвет (цвет можно подобрать самим, он должен быть пропорционален значению $z_N$ - меняться от яркого если $z_N$ мало и до черного если $z_N$ большое). Используйте класс Complex и перегруженные операторы. Пример работы с изображениями в формате \texttt{ppm} можно посмотреть в файле \texttt{complex\_image.cpp}. Программа должна создавать файл \texttt{julia.ppm}. | ||||
| 
 | ||||
| \begin{center} | ||||
| \includegraphics[scale=0.7]{../images/complexplane.png} | ||||
| \end{center} | ||||
| 
 | ||||
| \item Нарисуте изображение для $c = -0.4 + 0.6i$;\quad $c = -0.70 - 0.38i$;\quad $c = -0.80 + 0.16i$\quad  и\quad $c = 0.280 + 0.011i$. | ||||
| \item Добавьте параметры командной строки: 2 вещественных числа, соответствующие комплексному числу $c$, и целое число итераций $N$.  | ||||
| \item \textbf{Mandelbrot:} Зафиксируем теперь $z_0 = 0$ и будем менять $c$. Численно найдите все параметры $c$, для которых точка $z_0$ не является убегающей. Для этого создайте изображение размера 800x800, покрывающую область \texttt{[-2:2]x[-2:2]} возможных значений $c$ на комплексной плоскости. Программа должна создавать файл \texttt{mandelbrot.ppm}. | ||||
| 
 | ||||
| \item \textbf{Анимация:} Программа \texttt{complex\_movie.cpp} создаёт множество изображений и сохраняет их в папку \texttt{animation} (если у вас нет такой папки -- создайте её). Эти изображения представляют собой отдельные кадры будущей анимации. Чтобы их объединить в одно видео можно использовать программу ffmpeg (Нужно скачать тут: \href{https://www.ffmpeg.org/}{www.ffmpeg.org} и изменить переменную среды \texttt{PATH} в настройках Windows или Linux). После этого можно будет объединить все изображения в одно видео такой командой: | ||||
| \begin{verbatim} | ||||
| ffmpeg -r 60 -i animation/complex_%03d.ppm complex_movie.mp4 | ||||
| \end{verbatim} | ||||
| Создайте анимацию из изображений множеств Julia при $c$ линейно меняющемся от $(-1.5 - 0.5i)$ до $i$. | ||||
| \end{itemize} | ||||
| \end{document} | ||||
		Reference in a new issue