\chapter{実装}
\label{sec:実装}
\section{Pythonによる実装}
\label{sec:pythonによる実装}
\subsection{実装するクラス図}
\label{sec:実装するクラス図}
本研究では，デザインパターンの１つであるインタプリタパターンを利用してクラス図を作成した．インタプリタパターンについては，\cite{Java言語で学ぶデザインパターン入門}を参考にした．インタプリタパターンは，解析された結果に則り，処理を実行したい場合に利用される．本研究では，与えられた文字列をPLYを利用し，字句解析・構文解析を行う．そのため，木文法を扱うのに適しているインタプリタパターンを利用し，クラス図を作成した．メリットとしては，プログラムの修正が簡単になることやテストが簡単に行うことができると考えられる．

本クラス図は18のクラスからなり，抽象クラスとして，Nodeクラスを定義し,非終端クラスと終端クラスに共通するインターフェースを定義する．残りのクラスは，主に描画する流線パターンに対応している．また,流線パターン以外にも存在し,Consクラスによりリストの連接を表す．また，非終端クラスの集合｛A0，B0\_plus，B0\_minus，A\_plus，A\_minus，A2，Cons，B\_plus\_plus，B\_plus\_minus，
Beta\_plus，B\_minus\_minus，B\_minus\_plus，Beta\_minus，C\_plus，C\_minus｝，終端クラスの集合｛Nil，Leaf｝とする．



\begin{figure}[H]
\centering
\includegraphics[width=160mm]{class_diagram.png}
\caption{作成したクラス図}
\end{figure}

\subsection{描画機能の実装：大きさの決定}
\label{sec:描画機能の実装：大きさの決定}
Pythonで流線図を描画するにあたり，Python用のライブラリであるmatplotlibを使用する．matplotlibはグラフ描画のためのライブラリであり，棒グラフや折れ線グラフなどの一般的なグラフを作図することができる．また，それ以外にも平面上への関数・図形の描画や波のシミュレーションなど様々な描画にも利用できる．

自動描画を実現するプログラムは木表現を与えるのみで動作することが求められ，私達が引数を与えて円を描くことはできない．また，子を持つ親を描画する際，子は親の描く流線の内部に描画される必要があるため，必然的に親の大きさは子の大きさよりも大きくなる．そのため，プログラムには描画した際の大きさを柔軟に変更できる仕組みを組み込む必要がある．本研究では，この課題を解決するため木表現の葉から大きさを決定することにした．例として，$a_{+}$($b_{++}$($b_{++}$($l$, $l$), $l$))という木表現を挙げる．この木表現では，$a_{+}$が$b_{++}$という子を持ち，その子である$b_{++}$は($b_{++}$($l$, $l$), $l$))という2つの子を持っている親である．この場合，プログラムは$b_{++}$($l$, $l$)からその大きさを決める．続いて，$b_{++}$($l$, $l$)の親である$b_{++}$($b_{++}$($l$, $l$), $l$)の大きさを決定する．ここで，親の$b_{++}$の大きさは，子の$b_{++}$($l$, $l$), $l$)を踏まえた大きさとなる．そして最後に，その大きさをもとに，$a_{+}$の大きさが決定される．この流れを図\ref{fig:draw_flow}に示した．ここで，それぞれについて「大きさを決定する」としているのは，大きさを決定した時点ではmatplotlibのグラフ上に描画しないからである．これは，子から描画しようとしても，その時点ではグラフ中の位置を決定できないことによる．この例では，$b_{++}$($l$, $l$)の位置を先に決定してしまうと，その親である$b_{++}$の位置もそれに依存して決まってしまう．しかし，もし親の$b_{++}$がもう一つの子を持っていた場合，葉から描画していく仕様上もう一つの子も既に決められた位置を持つことになる．ここで，子の位置を決定する時点で他の流線との位置関係を決定できる仕組みがあり，２つの子の位置の整合性が取れているのであれば子から順に描画することもできるが，子の情報だけでは親との位置関係は分からないためこの仕組みは作成できない．そのため，実際にグラフ上に描画する前に根までのすべての大きさを決定する処理を行い，次に根の位置を決定し順に子を描画していく方法を取った．

\begin{figure}[H]
\centering
\includegraphics[width=7cm]{draw_flow.png}
\caption{$a_{+}$($b_{++}$($b_{++}$($l$, $l$), $l$))大きさ決定のイメージ}
\label{fig:draw_flow}
\end{figure}

\subsection{描画機能の実装：流線の描画}
\label{sec:描画機能の実装：流線の描画}
matplotlibでは，円や長方形などの図形をもともと用意されている関数で呼び出したりできるが，これらは決められた形にしかならない．流線を描画するにあたり，一部のトポロジーは円などの固定された図形でも表現可能だが，$\beta$系を含む流線はそれらで表すことができず，時々に合わせて形を変えることが求められる．そこで，本研究ではこれらの$\beta$系を含む図形を点でモデル化することにした．例として，$a_{+}$が子に$\beta$系を持っていると想定した場合の流線を図\ref{fig:a+-have-beta}に示す．ただ，これは製作途中の仮のものであるため，その子の大きさの円を仮に与え描画している．この図形は，点5つから構成されている．子の専有領域の接合部である2点と最右点・最左点・最下点の3点である．この5点を、スプライン補間で補間することにより流線を表現した．

\begin{figure}[H]
\centering
\includegraphics[width=2cm]{a+-have-beta.png}
\caption{$\beta$系を持つ図形の作図}
\label{fig:a+-have-beta}
\end{figure}

\section{Asymptoteによる実装}
\label{sec:Asymptoteによる実装}
本研究での目的達成の成果物は明確には定めておらず，一意に決まるものではない．Asymptoteによる実装では，与えられた木表現に対して\ref{sec:可読性の定義}の定義を満たす図を作成するためのライブラリを作成することで本研究の目的の達成したと言えることとする．

\subsection{Asymptoteによる実行方法}
\label{sec:Asymptoteによる実行方法}
Asymptoteではプログラムを実行する方法として，Ubuntuの端末やWindowsのコマンドプロンプト上に直接コードを記述するinteractive mode(対話モード)という方法が存在する．そこでライブラリを読み込み，画面上に表示させたい流線図に対応する関数を記述することで，画面上にトポロジー化された流線図を表示させる．

\subsection{提供するライブラリ}
\label{sec:提供するライブラリ}
ライブラリ内の流線図には，図に配置の基準となる点や大きさなど，利用者が指定しなければならないパラメータが必ず付与されている．\ref{sec:可読性の定義}の定義を満たす図を作図するためには，ずべての流線図の特徴とコードを把握する必要がある。

\subsubsection{パラメータのデータ型}
\label{sec:パラメータのデータ型}
\begin{itemize}
\item pair
ｘ座標とｙ座標の二次元座標における複素数を表すデータ型であり、本研究では図の基準点として扱う。例えば実部ｘに０、虚部ｙに０を代入すると（０，０）を基準点として作図される。
\item real
実数を表すパラメータであり、本研究では渦心円の大きさとして扱う。a+、a-の図では渦心円の半径を示している。すなわち、渦心円の大きさはreal型に与えられた実数に比例する。渦心円の中には他の流線図が入る場合もため、その場合は中の流線図より大きい値をreal型に与えなければ、\ref{sec:可読性の定義}の定義を満たない図となるため作図するたびに調節する必要性がある。
\item bool3
・bool3型の特徴と説明
・boolとの違い
\end{itemize}

\subsubsection{関数}
\label{sec:関数}
\begin{itemize}
\item draw
・特徴
・役割
・中に入る関数の可能性
\item arrow
・特徴
・役割
\item circle
・circleの特徴
　realの大きさによって比例
\item mydraw
・mydrawの特徴

\item dox
・doxの特徴
・doxは淀み点
\item scale
・scaleの特徴
・scaleの役割
・scale
\end{itemize}



\subsection{a+とa-}
\label{sec:a+とa-}

【ここにソースコード】 

\subsubsection{a+とa-の特徴}
\label{sec:a+とa-の特徴}


\begin{figure}[H]
\centering
\includegraphics[width=4cm]{a+fin.pdf}
\caption{a+}
\end{figure}

【a-の図】
・a+とa-の特徴【説明は参考文献から持ってくる】
・図における基準点や半径の説明
・渦円心の中に入る流線図


\subsection{b系}
\label{sec:b系}

【ここにソースコード】


\subsubsection{b系の特徴}
\label{sec:b系の特徴}

【図】

・特徴

・２つのbool3

・渦円心の中に入る流線図

\subsection{構造体}
\label{sec:構造体}
　・構造体での表現による利点
　・オブジェクト指向的な設計
　・隠蔽

\subsection{クラス図との対応}
\label{sec:クラス図との対応}
　・クラス図に対応している場所や有無
　
　　
\subsection{描画の限界}
\label{sec:描画の限界}
　　・線が潰れる
　　

\subsection{まとめ}
\label{sec:まとめ}
　・入力を完全な木表現？で作図することはできず
　・原因


