Папоротник особенности реализации
This commit is contained in:
@@ -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 {Результаты работы программы}
|
||||
|
||||
Reference in New Issue
Block a user