moonpool/benchs/raytracer/vec3.ml
Simon Cruanes ddf0f258c7
move files
2023-06-08 15:25:06 -04:00

47 lines
783 B
Standard ML

type vec3 = { x: float;
y: float;
z: float }
let of_floats (e1, e2, e3) =
{x = e1; y = e2; z = e3}
let add v w =
{x = v.x +. w.x;
y = v.y +. w.y;
z = v.z +. w.z}
let sub v w =
{x = v.x -. w.x;
y = v.y -. w.y;
z = v.z -. w.z}
let neg v =
sub {x= 0.0; y=0.0; z=0.0} v
let dot v w =
v.x*.w.x +. v.y*.w.y +.v.z*.w.z
let cross v w =
{x = v.y*.w.z -. v.z*.w.y;
y = v.z*.w.x -. v.x*.w.z;
z = v.x*.w.y -. v.y*.w.x}
let length v =
sqrt (dot v v)
let unit_vector v =
let l = length v in
{ x = v.x /. l;
y = v.y /. l;
z = v.z /. l }
let mul t v =
{ x = t *. v.x;
y = t *. v.y;
z = t *. v.z }
(* pairwise multiplication *)
let pmul v w =
{ x = v.x *. w.x;
y = v.y *. w.y;
z = v.z *. w.z; }