54 lines
1.4 KiB
OCaml
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
|