type t = float array let zero = [| 0. ; 0. ; 0. |] let of_float_triplet (x,y,z) = [|x;y;z|] let of_3_floats x y z = [|x;y;z|] let to_string x = (string_of_float x.(0))^" "^(string_of_float x.(1))^" "^(string_of_float x.(2)) let x a = a.(0) let y a = a.(1) let z a = a.(2) let coord a = function | 0 -> a.(0) | 1 -> a.(1) | 2 -> a.(2) | _ -> raise (Invalid_argument "Coordinate") let to_float_array a = a (** Linear algebra *) let (|-) a b = match a,b with | [|x;y;z|], [|x';y';z'|] -> [| x-.x'; y-.y'; z-.z' |] | _ -> assert false let (|+) a b = match a,b with | [|x;y;z|], [|x';y';z'|] -> [| x+.x'; y+.y'; z+.z' |] | _ -> assert false let (|.) s a = match a with | [|x;y;z|] -> [| s*.x; s*.y; s*.z |] | _ -> assert false let dot a b = match a,b with | [|x;y;z|], [|x';y';z'|] -> x*.x' +. y*.y' +. z*.z' | _ -> assert false let norm u = sqrt @@ dot u u