open Point type t = {dx:float; dy:float; dz:float} let dotproduct a b = a.dx *. b.dx +. a.dy *. b.dy +. a.dz *. b.dz let between p q = {dx = q.x -. p.x; dy = q.y -. p.y; dz = q.z -. p.z} let opposite v = {dx = -. v.dx; dy = -. v.dy; dz = -. v.dz} let point_along p v ac = { x = p.x +. v.dx *. ac; y = p.y +. v.dy *. ac; z = p.z +. v.dz *. ac } let product a b = { dx = a.dy *. b.dz -. a.dz *. b.dy; dy = a.dz *. b.dx -. a.dx *. b.dz; dz = a.dx *. b.dy -. a.dy *. b.dx } let length a = sqrt(a.dx *. a.dx +. a.dy *. a.dy +. a.dz *. a.dz) let length2 a = a.dx *. a.dx +. a.dy *. a.dy +. a.dz *. a.dz let scale a s = {dx = a.dx *. s; dy = a.dy *. s; dz = a.dz *. s} let normalize a = scale a (1.0 /. length a) let sub a b = {dx = a.dx -. b.dx; dy = a.dy -. b.dy; dz = a.dz -. b.dz}