type vector = { x : float; y : float } let right = { x = 1.0; y = 0.0 } let up = { x = 0.0; y = 1.0 } let zero = { x = 0.0; y = 0.0 } let epsilon = 0.000001 let ( -- ) a b = { x = a.x -. b.x; y = a.y -. b.y } let ( ++ ) a b = { x = a.x +. b.x; y = a.y +. b.y } let ( *+ ) s a = { x = a.x *. s; y = a.y *. s } let sqlen a = a.x *. a.x +. a.y *. a.y let len a = sqrt (sqlen a) let equal a b = sqlen (a -- b) < epsilon exception ZeroVector let normalize a = let l = len a in if l < epsilon then raise ZeroVector else (1. /. l) *+ a let dot a b = a.x *. b.x +. a.y *. b.y