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