From 3848e72498dbe662cfe7fa1fe9534c0520ec59b7 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 10 Nov 2024 03:22:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D0=BF=D0=BE=D1=80=D0=BE=D1=82?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=20=D0=BE=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/report/report.tex | 77 +++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/lab2/report/report.tex b/lab2/report/report.tex index 618ce77..4a0ebf7 100644 --- a/lab2/report/report.tex +++ b/lab2/report/report.tex @@ -38,17 +38,17 @@ \usepackage{enumitem} %для перечислений % Настраиваем листинги, чтобы они использовали счётчик figure -\AtBeginDocument{ - \renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки - \renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок" -} +% \AtBeginDocument{ +% \renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки +% \renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок" +% } % Автоматически увеличиваем счетчик figure перед каждым листингом -\let\oldlstlisting\lstlisting -\renewcommand{\lstlisting}[1][]{% - \refstepcounter{figure}% Увеличиваем счетчик figure - \oldlstlisting[#1]% Вызываем оригинальную команду lstlisting -} +% \let\oldlstlisting\lstlisting +% \renewcommand{\lstlisting}[1][]{% +% \refstepcounter{figure}% Увеличиваем счетчик figure +% \oldlstlisting[#1]% Вызываем оригинальную команду lstlisting +% } \newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}} @@ -59,7 +59,7 @@ allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные) % подгружаемые языки — подробнее в документации listings (это всё для листингов) -\lstloadlanguages{ SQL} +\lstloadlanguages{ Haskell} % включаем кириллицу и добавляем кое−какие опции \lstset{tabsize=2, breaklines, @@ -73,7 +73,7 @@ extendedchars=true } \lstdefinelanguage{MyC}{ - language=SQL, + language=Haskell, % ndkeywordstyle=\color{darkgray}\bfseries, % identifierstyle=\color{black}, % morecomment=[n]{/**}{*/}, @@ -99,7 +99,7 @@ % Настройка листингов \lstset{ - language=SQL, + language=Haskell, extendedchars=\true, inputencoding=utf8, keepspaces=true, @@ -285,9 +285,62 @@ \item \( s_j(t-1) \) — стратегия оппонента на шаге \( t-1 \). \end{itemize} + \newpage \section {Особенности реализации} + \subsection{Папоротник Барнсли} + \subsubsection{Аффинные преобразование точек} + Функции, код которых представлен в листинге~\ref{lst:trfs}, реализуют четыре аффинных преобразования, используемых для построения фрактала папоротника Барнсли. Каждое преобразование принимает на вход точку в двумерном пространстве (координаты \( x \) и \( y \)) и возвращает новую точку, которая является результатом применения соответствующего преобразования. + + \begin{lstlisting}[mathescape=true, caption={Код функций, резализующих аффинные преобразования над точками для построения папоротника Барнсли.}, label={lst:trfs}] + type Point = (Float, Float) + + transformation1 :: Point -> Point + transformation1 (_, y) = (0, 0.16 * y) + + transformation2 :: Point -> Point + transformation2 (x, y) = (0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6) + + transformation3 :: Point -> Point + transformation3 (x, y) = (0.2 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6) + + transformation4 :: Point -> Point + transformation4 (x, y) = (-0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44) + \end{lstlisting} + + \subsubsection{Генерация новой точки} + + Генерация новой точки происходит с помощью функции \texttt{genNextPoint} и вспомогательной функции \texttt{applyTransformation}, код которых представлен в листинге~\ref{lst:genDot}. \texttt{applyTransformation} принимает на вход исходную точку и случайное число от 0 до 1, затем выбирает и применяет к точке трансформацию в соответствии с заданными вероятностями, и возвращает новую точку. \texttt{genNextPoint} принимает на вход исходную точку, генерирует случайное число от 0 до 1, применяет функцию \texttt{applyTransformation} и возвращает новую точку. + + \begin{lstlisting}[caption={Код функций для генераций новых точек в папоротнике Барнсли.}, label={lst:genDot}] + import System.Random (randomRIO) + + applyTransformation :: Point -> Float -> Point + applyTransformation point random + | random < 0.01 = transformation1 point + | random < 0.86 = transformation2 point + | random < 0.93 = transformation3 point + | otherwise = transformation4 point + + genNextPoint :: Point -> IO Point + genNextPoint point = do + random <- randomRIO (0.0, 1.0 :: Float) + return $ applyTransformation point random + \end{lstlisting} + + \subsubsection{Рекурсивная генерация папоротника Барнсли} + + Функция \texttt{barnsleyFern}, код которой представлен в листинге~\ref{lst:barnsleyFern}, реализует рекурсивный алгоритм генерации списка точек, из которых состоит папоротник Барнсли. Функция принимает на вход начальную точку и число -- количество шагов рекурсии, а возвращает список точек папоротника Барнсли. + + \begin{lstlisting}[caption={Код функции для построения папоротника Барнсли.}, label={lst:barnsleyFern}] + barnsleyFern :: Point -> Int -> IO [Point] + barnsleyFern _ 0 = return [] + barnsleyFern startPoint n = do + x' <- genNextPoint startPoint + xs <- barnsleyFern x' (n - 1) + return (startPoint : xs) + \end{lstlisting} \newpage \section {Результаты работы программы}