Real World Haskell Chapter 3: EXERCISE 10 - 13

第3章の EXERCISE 10 から 13 を解いてみたくなったので、やってみる。2次元平面上の3点、a, b, c を考え、a → b、b → c という 2 つの線分が作る角は右に折れるか、左に折れるか、真っ直ぐか、という問題。

図にすると、こう。

……タッチパッドで頑張って描きました。

EXERCISE 10. は、方向を表す型、Direction を定義せよ、という問題。

まぁ、こうですよね。

data Direction = LeftTrun | RightTurn | Straight

真っ直ぐ戻る、という場合も考えないとダメなのかなぁ?

EXERCISE 11. 3 つの点をとって、Direction を返す関数を定義せよ。

\Delta{x_{b-a}}\Delta{x_{c-b}}の比、\Delta{y_{b-a}}\Delta{y_{c-b}}の比に注目します。これらが等しくなるとき、2つの線分は真っ直ぐ並びます。図のように\Delta{x_{c-b}}/\Delta{x_{b-a}}<\Delta{y_{c-b}}/\Delta{y_{b-a}}なら左折、逆なら右折です。多分。

なので、

direction (ax, ay) (bx, by) (cx, cy)
    | dx_cb * dy_ba < dx_ba * dy_cb = LeftTrun
    | dx_cb * dy_ba > dx_ba * dy_cb = RightTurn
    | dx_cb * dy_ba == dx_ba * dy_cb = Straight
    where dx_ba = bx - ax
          dx_cb = cx - bx
          dy_ba = by - ay
          dy_cb = cy - by

まんま書いて、こう。

EXERCISE 12. は点のリストをとって、Direction のリストを返す関数を定義せよ、という問題。

……なんか、飽きてきたな。

directions (a:b:c:[]) = [direction a b c]
directions (a:b:c:rest) = (direction a b c):(directions (b:c:rest))

で、13. が本題、…なんでしょうが、もう遅いし、寝ます。

気が向いたら、続きを書く、かも。