bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

凹むこともある多角形(1)

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]

何とも簡単。