Files
comp3958/tinker/sphere.ml
T

54 lines
1.4 KiB
OCaml

let stacks = 10;;
let slices = 12;;
let radius = 0.175;;
let gen_sphere_vertecies st sl r =
let rec gen_slice j sp cp sv =
if j = -1 then sv
else
let theta = 2. *. 3.1415926 *. float_of_int j /. float_of_int (sl) in
let sinTheta = sin theta in
let cosTheta = cos theta in
gen_slice (j - 1) sp cp ((r *. cosTheta *. sp, r *. cp, r *. sinTheta *. sp) :: sv)
in
let rec gen_stack i sv =
if i = -1 then sv
else
let phi = 3.1415926 *. float_of_int i /. float_of_int (st - 1) in
let sinPhi = sin phi in
let cosPhi = cos phi in
gen_stack (i - 1) (gen_slice (sl - 1) sinPhi cosPhi sv)
in
gen_stack (st - 1) [];;
let reverse_tr l =
let rec reverse_tr' acc l =
match l with
| [] -> acc
| x :: xs -> reverse_tr' (x :: acc) xs
in
reverse_tr' [] l;;
let write_string_list_to_file filename (lines : string list) : unit =
Out_channel.with_open_text filename (fun oc ->
List.iter (Printf.fprintf oc "%s\n") lines
);;
let convert_to_string l =
let rec convert r n =
match r with
| [] -> reverse_tr n
| (x, y, z) :: xs ->
let s = Printf.sprintf "(%f, %f, %f)" x y z in
convert xs (s :: n)
in
convert l [];;
let () =
let vertecies = gen_sphere_vertecies 10 12 0.175 in
let file_path = "output.txt" in
write_string_list_to_file file_path (convert_to_string vertecies);
Printf.printf "Successfully wrote list to %s\n" file_path