From 27aab688432670cf737357aeae1fb89c2374aa5a Mon Sep 17 00:00:00 2001 From: SowinskiBraeden Date: Thu, 22 Jan 2026 00:01:16 -0800 Subject: [PATCH] start sphere in ocaml cause i am big brean genius --- tinker/cube | Bin 87353 -> 89671 bytes tinker/cube.ml | 137 +++++++++++++++++++++++++++++++++++++++------- tinker/output.txt | 0 tinker/proper.txt | 6 ++ tinker/sphere.ml | 53 ++++++++++++++++++ tinker/test.c | 91 ++++++++++++++++++++++++++++++ tinker/test.o | Bin 0 -> 16176 bytes tinker/tinker.ml | 53 ++++++++++++++++++ 8 files changed, 321 insertions(+), 19 deletions(-) create mode 100644 tinker/output.txt create mode 100644 tinker/proper.txt create mode 100644 tinker/sphere.ml create mode 100644 tinker/test.c create mode 100755 tinker/test.o create mode 100644 tinker/tinker.ml diff --git a/tinker/cube b/tinker/cube index a2f69fb89bc49ca1f0e8856c79a9eba4c1271477..a8c9e6b50d625399aa9e92f58f57a79694f57dfd 100755 GIT binary patch delta 2924 zcmb`JT}+l`7{{NR58*{5K9m=D`9@I@by+g)ATXqjfVL*NwFXUJAlw`}WzE*++W~Dk zg%0k6XLFO)`t&3FqDWIqTj`o(t%IiPpjgYfHeDWc;3D4sznABxH-hS*d;7ol{ap9; z^}nv`dEm^6^vmbcpC2=m1t~A2+Lw+N`gaS=RlB)6*Z;M^w3}CL?dLWA7fa27SlIKt zh_FN`7t)0qAu4nUH;sO@8idz`-9mP-XKBYKO~8h8hEN@x7iq5&uzg*?u3JbIHVCzz zXYaq2XOA7t+?br7gdZ5QgK;{p}yOcE~DC3fQba30-&Sp=DbuK*;`!{+AkA!XU-rUEM2ZtcT3PLd; z1YD0?ozb}*Btng=1jc|IRtSr1&f&0GZP(?7W83wNe|p(0pwH+cXVh89Tx)0m_xNfO zSe)G)@LI8wZFpux$qW0WTJUDhT&CIbixs_uMU6!|odQ%h3U3O@r6A?cL=%?{!dn7i zs|8ZW7iDHqCTwek3_IEtF4Msq667GxU=oESITzYT=7=6F7ob2QtA#p2 zu@Y-Yzm6_4=u*5w!TBKh5n-`spNwZEYH(7IE=Tr%;vCX_MZ$dM3kx4ogp&(Vt}`iC z20J?LE_sZUesv;$as)KDULbd#UlbY7j!uSS7j=qCLaCiAv=i;tKDQE#7HKeQ?Cy^N zRofcK=HB72W&XQZBJjiWUnXV%j_wtr9?8$H@9sWd_nC8akWpLgsAaW)jM>Y9a za}~)xS;kPG3S_P!I7R;U0`k)f$lvLi=fVZVId37(X&fy|mgzCk*kl>+A|#xQHZHYa z^+!T@g=&?(Jsr8%wF@aN?G~;RM2j|Z@8pw`NBx7TCb9xCokX2baDG?74Q2`Xctepn zX+rPmnfv$spNma}`M}RAF*TvFK>DHIP+}U3QQ*bdFYu-MNI*93kCd2gTUs@pJboOA z&uHhvK;zd4%yPAKXmGs{Fz~ibX}-0x?L=!Nh9-r4WjY?G?M@TzE@?ik9rm#48lBz9p@+X8e*arGF>j|!M+zvC_8}=^%xF2|JJLhu=;82+WF$vo z=yFeD?8uytdY#dSXjC>-^All{=O2!k>JV~>o%7E|Ow1mes`r1&H$^RLCBw&h;X#3a zbXWxf|4nQb&I?gtlYoAoP$fJdaDQQZU#V$anfJ2J)A~edPqmp|N__lMvl+_R&=B1* zFtBH^vTxTwPvyX1f8{g1`v!XtWcMZ3myOv|$M1a8v9qZWLR!Bx`gLull%KMaN3P{} z{8kle3hun7Y$x$|w3%Z6sWy|H5qR>4+f2#$kv6l+gl4__W9{ZX^QnKc-8^K@`)fK( xnYl3D+F@EUa&L_8&%GYYTVL2`zq@jEqSGJkG*6@~|JuLXshJ(~iyt?Ye*olybEN

OQEvBM@YDCb2XcBSgQ%O;DaBIk*Wb zX1M5}gY}~yem3$jIJvlpt2j8sNgO&j2rhm8|KUB1`aeSYh;o0gwh2Fa^GeQlpq3fYrbP9o3It`|WeE7|Ezh zfMY+{2qNAb!^{|ddBD?F`r^DXUA4sh_w_=qO>Uz-o_$N$Ur z4^`$n^9or#nxwf|s|HCixK-=Gnz!X^gRoibRxkua=~IUE_I*Y|=48(>2m8tbjq1Ji zhQ4D+Jlt$4r*6o+#Gb!K##O)+Fn-!LT;oA=ZOT{k7)$2$F9Wk)~t+|P6}Eyu?u zUDsuf=bromGdp1$;MfH}*V_S0;}~7m_tTQr=aZ7y%Rt`8^<~#(tN4Ko-UAI&vt@lf zg!M7#tmUPyXC&LrUuqh#j#v77M(o@^nCu~r6kyZmz#^!C-C!7;1tu5=^w*ppn%&FaqOGEIId)OTMZYV_h`iQ6OEMvg wI#-qrQgcp}r4UJEm&`*WUowr$x2E01h1*fRFeN8L14nhl!nF_TtR () | (a, b, c, d) :: fs -> draw_face (a, b, c, d) angle; - iter_faces fs angle;; + draw_cube fs angle;; +(* END CUBE *) -let rec spin_cube angle = +(* SPHERE *) +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 s_vertecies = gen_sphere_vertecies stacks slices radius;; + +let draw_ellipse ev o = + let f = match ev with + | [] -> (0., 0., 0.) + | a :: _ -> a in + + let rec iter_vertex l v = + match v with + | [] -> l + | [a] -> draw_line a l; a + | [a; b] -> draw_line a b; b + | a :: b :: vs -> + draw_line a b; + iter_vertex b (b :: vs) + in + let l = iter_vertex (0., 0., 0.) ev in + + if o then draw_line f l;; + +let rec get_nth_vert e n = + match e with + | [] -> failwith "cannot find nth vertex" + | x :: xs -> + if n = 0 then x + else get_nth_vert xs (n - 1);; + +let draw_sphere v st sl = + let rec render_slices i = + let rec iter_slices j e = + if j = (sl - 1) then e + else + iter_slices (j + 1) (get_nth_vert v (i * sl + j) :: e) + in + let e = iter_slices 0 [] in + draw_ellipse e true; + if i = st - 1 then () + else render_slices (i + 1) + in + + let rec render_stacks j = + let rec iter_stacks i e = + if i = (st - 1) then e + else iter_stacks (i + 1) (get_nth_vert v (i * sl + j) :: e) + in + let e = iter_stacks 0 [] in + draw_ellipse e false; + if j = sl - 1 then () + else render_stacks (j + 1) + in + + render_slices 0; + render_stacks 0;; + +let list_translate_z l = + let rec translate r n = + match r with + | [] -> n + | x :: xs -> translate (xs) (translate_z x 1. :: n) + in + + translate l [];; + +let list_rotate_y l angle = + let rec translate r n = + match r with + | [] -> n + | x :: xs -> translate (xs) (rotate_y x angle :: n) + in + + translate l [];; + +(* END SPHERE *) + +let rec animate angle sv = clear_graph (); set_color (rgb 0 0 0); @@ -114,17 +212,18 @@ let rec spin_cube angle = set_color cyan; - iter_faces faces angle; + (* draw_cube faces angle; *) + draw_sphere sv stacks slices; Graphics.synchronize (); - spin_cube (angle +. 0.000075);; + animate (angle +. 0.0005) (list_translate_z (list_rotate_y (gen_sphere_vertecies 10 12 0.175) angle));; let () = open_graph " 800x800+560+140"; auto_synchronize false; - spin_cube 0. 100; + animate 0. s_vertecies; close_graph () diff --git a/tinker/output.txt b/tinker/output.txt new file mode 100644 index 0000000..e69de29 diff --git a/tinker/proper.txt b/tinker/proper.txt new file mode 100644 index 0000000..eb8efda --- /dev/null +++ b/tinker/proper.txt @@ -0,0 +1,6 @@ +(0.000000, 0.050000, 0.000000) +(-0.000000, 0.050000, 0.000000) +(-0.000000, 0.050000, -0.000000) +(-0.000000, -0.050000, -0.000000) +(0.000000, -0.050000, -0.000000) +(0.000000, -0.050000, 0.000000) diff --git a/tinker/sphere.ml b/tinker/sphere.ml new file mode 100644 index 0000000..22fbe68 --- /dev/null +++ b/tinker/sphere.ml @@ -0,0 +1,53 @@ +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 diff --git a/tinker/test.c b/tinker/test.c new file mode 100644 index 0000000..39fcec1 --- /dev/null +++ b/tinker/test.c @@ -0,0 +1,91 @@ +#include +#include +#include + +// validating the vertecies generated by tinker.ml are correct + +typedef struct VEC3 { + float x; + float y; + float z; +} VEC3; + +void print_vertecies(VEC3 v[], size_t s) +{ + printf("["); + for (int i = 0; i < s; i++) + { + printf("(%f, %f, %f)\n", v[i].x, v[i].y, v[i].z); + } + printf("]"); +} + +VEC3 *gen_sphere_vertecies(int stacks, int slices, float r) +{ + // Generate sphere vectors + VEC3 *sphere_vertecies = malloc(stacks * slices * sizeof(VEC3)); + + for (int i = 0; i < stacks; i++) + { + // Phi (angle of latitude, ranges from 0 to PI) + float phi = M_PI * (float)i / (float)(stacks - 1); + float sinPhi = sin(phi); + float cosPhi = cos(phi); + + for (int j = 0; j < slices; j++) + { + // Theta (angle of longitude, ranges from 0 to 2*PI) + float theta = 2.f * M_PI * (float)j / (float)slices; + float sinTheta = sin(theta); + float cosTheta = cos(theta); + + // Convert spherical coordinates to Cartesian (x, y, z) + // The choice of axis mapping may vary. Here Y is vertical. + sphere_vertecies[i * slices + j] = (VEC3){ + .x = r * cosTheta * sinPhi, + .y = r * cosPhi, + .z = r * sinTheta * sinPhi, + }; + } + } + + return sphere_vertecies; +} + +int main(void) +{ + int stacks = 10; + int slices = 12; + float r = 0.175; + + // Generate sphere vectors + VEC3 sphere_vertecies[stacks * slices]; + + for (int i = 0; i < stacks; i++) + { + // Phi (angle of latitude, ranges from 0 to PI) + float phi = M_PI * (float)i / (float)(stacks - 1); + float sinPhi = sin(phi); + float cosPhi = cos(phi); + + for (int j = 0; j < slices; j++) + { + // Theta (angle of longitude, ranges from 0 to 2*PI) + float theta = 2.f * M_PI * (float)j / (float)slices; + float sinTheta = sin(theta); + float cosTheta = cos(theta); + + // Convert spherical coordinates to Cartesian (x, y, z) + // The choice of axis mapping may vary. Here Y is vertical. + sphere_vertecies[i * slices + j] = (VEC3){ + .x = r * cosTheta * sinPhi, + .y = r * cosPhi, + .z = r * sinTheta * sinPhi, + }; + } + } + + print_vertecies(sphere_vertecies, stacks * slices); + + return 0; +} diff --git a/tinker/test.o b/tinker/test.o new file mode 100755 index 0000000000000000000000000000000000000000..8c993c1800bd32025252fbf8c2c1bad9f33a3978 GIT binary patch literal 16176 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 literal 0 HcmV?d00001 diff --git a/tinker/tinker.ml b/tinker/tinker.ml new file mode 100644 index 0000000..5796762 --- /dev/null +++ b/tinker/tinker.ml @@ -0,0 +1,53 @@ +(*** testing stuff ***) + +let stacks = 10;; +let slices = 12;; + +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 (slices) 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 (stacks - i) in + let sinPhi = sin phi in + let cosPhi = cos phi in + gen_stack (i - 1) (gen_slice (slices - 1) sinPhi cosPhi sv) + in + + gen_stack (stacks - 1) [];; + +let draw_line (x1, y1) (x2, y2) = + Printf.printf "(%f, %f) -> (%f, %f)\n" x1 y1 x2 y2 + +let draw_ellipse ev o = + let f = match ev with + | [] -> (0., 0.) + | (x, y, _) :: _ -> (x, y) in + + let rec iter_vertex (lx, ly) v = + match v with + | [] -> (lx, ly) + | [(x, y, _)] -> draw_line (x, y) (lx, ly); (x, y) + | [(x1, y1, _); (x2, y2, _)] -> draw_line (x1, y1) (x2, y2); (x2, y2) + | (x1, y1, _) :: (x2, y2, _) :: vs -> + draw_line (x1, y1) (x2, y2); + iter_vertex (x2, y2) ((x2, y2, 0.) :: vs) + in + let l = iter_vertex (0., 0.) ev in + + if o = 0 then draw_line f l;; + +let rec get_nth_vert e n = + match e with + | [] -> failwith "cannot find nth element" + | x :: xs -> + if n = 0 then x + else get_nth_vert xs (n - 1);;