1.タイプを用意
多角形は、コンピュータ・グラフィックスやアニメーションを行うときに最も基本的な図形である。多角形には、三角形も、四角形も含まれるし、辺の数をとても多くしてあげると、円にも楕円にもなる。
そこで、多角形を記述するのに必要な型シノニムを用意しよう。
ここでは次のものを用意した。
type Vertex = (Double, Double) type Side = Double type Polygon = [Vertex] type Perimeter = Side type Area = Double type Angle = Double
ここで、Vertexは頂点、Sideは辺、Polygonは多角形、Perimeterは多角形の周囲の長さ(辺の長さの総和)、Areaは多角形の面積、Angleは角度である。
2.辺の長さ
次に、多角形の特徴を求めることとする。簡単なところから始める。最初は、辺の長さである。これは隣り合う二頂点間の距離を求めることである。二頂点を\(v_1=(x_1,y_1),v_2=(x_2,y_2)\)とすると、その間の距離は\( \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}\)である。従って、次のように計算することができる。
sideLength :: Vertex -> Vertex -> Side sideLength (x1, y1) (x2, y2) | x1 == x2 && y1 == y2 = error "Two vertices are identical." | otherwise = sqrt $ (x1 - x2) ^ 2 + (y1 - y2) ^ 2
なお、ここでは、二頂点の座標が同一であるときはエラーとした。
3.周囲の長さ
辺の長さが得られたので、多角形の周囲の長さを求めることにする。多角形の頂点の列を\(v_1,v_2,..,v_n\)とする。この時、最後の頂点を最初に持ってきて得た頂点の列は\(v_n,v_1,v_2,..,v_{n-1}\)となる。ここで、この二つの頂点の列は、同じ項に隣り合う頂点(最初の項であれば\(v_1\)と\(v_n\))を有している。従って、始めに、それぞれの項ごとに、頂点間の距離(即ち、辺の長さ)を求める。次に、これらの総和を求めると、これが周囲の長さとなる。従って、プログラムは次のようになる。
perimeter :: Polygon -> Perimeter perimeter poly = sum $ zipWith sideLength poly $ tail poly ++ [head poly]
何とも簡単。