Папоротник особенности реализации

This commit is contained in:
2024-11-10 03:22:50 +03:00
parent b1a5ce5042
commit 3848e72498

View File

@@ -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 {Результаты работы программы}