Папоротник особенности реализации
This commit is contained in:
@@ -38,17 +38,17 @@
|
|||||||
\usepackage{enumitem} %для перечислений
|
\usepackage{enumitem} %для перечислений
|
||||||
|
|
||||||
% Настраиваем листинги, чтобы они использовали счётчик figure
|
% Настраиваем листинги, чтобы они использовали счётчик figure
|
||||||
\AtBeginDocument{
|
% \AtBeginDocument{
|
||||||
\renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки
|
% \renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки
|
||||||
\renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок"
|
% \renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок"
|
||||||
}
|
% }
|
||||||
|
|
||||||
% Автоматически увеличиваем счетчик figure перед каждым листингом
|
% Автоматически увеличиваем счетчик figure перед каждым листингом
|
||||||
\let\oldlstlisting\lstlisting
|
% \let\oldlstlisting\lstlisting
|
||||||
\renewcommand{\lstlisting}[1][]{%
|
% \renewcommand{\lstlisting}[1][]{%
|
||||||
\refstepcounter{figure}% Увеличиваем счетчик figure
|
% \refstepcounter{figure}% Увеличиваем счетчик figure
|
||||||
\oldlstlisting[#1]% Вызываем оригинальную команду lstlisting
|
% \oldlstlisting[#1]% Вызываем оригинальную команду lstlisting
|
||||||
}
|
% }
|
||||||
|
|
||||||
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)
|
allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)
|
||||||
|
|
||||||
% подгружаемые языки — подробнее в документации listings (это всё для листингов)
|
% подгружаемые языки — подробнее в документации listings (это всё для листингов)
|
||||||
\lstloadlanguages{ SQL}
|
\lstloadlanguages{ Haskell}
|
||||||
% включаем кириллицу и добавляем кое−какие опции
|
% включаем кириллицу и добавляем кое−какие опции
|
||||||
\lstset{tabsize=2,
|
\lstset{tabsize=2,
|
||||||
breaklines,
|
breaklines,
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
extendedchars=true
|
extendedchars=true
|
||||||
}
|
}
|
||||||
\lstdefinelanguage{MyC}{
|
\lstdefinelanguage{MyC}{
|
||||||
language=SQL,
|
language=Haskell,
|
||||||
% ndkeywordstyle=\color{darkgray}\bfseries,
|
% ndkeywordstyle=\color{darkgray}\bfseries,
|
||||||
% identifierstyle=\color{black},
|
% identifierstyle=\color{black},
|
||||||
% morecomment=[n]{/**}{*/},
|
% morecomment=[n]{/**}{*/},
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
|
|
||||||
% Настройка листингов
|
% Настройка листингов
|
||||||
\lstset{
|
\lstset{
|
||||||
language=SQL,
|
language=Haskell,
|
||||||
extendedchars=\true,
|
extendedchars=\true,
|
||||||
inputencoding=utf8,
|
inputencoding=utf8,
|
||||||
keepspaces=true,
|
keepspaces=true,
|
||||||
@@ -285,9 +285,62 @@
|
|||||||
\item \( s_j(t-1) \) — стратегия оппонента на шаге \( t-1 \).
|
\item \( s_j(t-1) \) — стратегия оппонента на шаге \( t-1 \).
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\section {Особенности реализации}
|
\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
|
\newpage
|
||||||
\section {Результаты работы программы}
|
\section {Результаты работы программы}
|
||||||
|
|||||||
Reference in New Issue
Block a user