finish cube + sphere animation
This commit is contained in:
7 files changed
+103
-163
No files matched your search
+55
-54
@@ -13,25 +13,34 @@ let project (x, y, z) =
|
||||
(x /. z, y /. z);;
|
||||
|
||||
let rotate_y (x, y, z) angle =
|
||||
let ox = x in
|
||||
let oz = z in
|
||||
(
|
||||
ox *. cos(angle) -. oz *. sin(angle),
|
||||
x *. cos(angle) -. z *. sin(angle),
|
||||
y,
|
||||
ox *. sin(angle) +. oz *. cos(angle)
|
||||
x *. sin(angle) +. z *. cos(angle)
|
||||
);;
|
||||
|
||||
let rotate_x (x, y, z) angle =
|
||||
let oy = y in
|
||||
let oz = z in
|
||||
(
|
||||
x,
|
||||
oy *. cos(angle) -. oz *. sin(angle),
|
||||
oy *. sin(angle) +. oz *. cos(angle)
|
||||
y *. cos(angle) -. z *. sin(angle),
|
||||
y *. sin(angle) +. z *. cos(angle)
|
||||
);;
|
||||
|
||||
let rotate_z (x, y, z) angle =
|
||||
(
|
||||
x *. cos(angle) -. y *. sin(angle),
|
||||
x *. sin(angle) +. y *. cos(angle),
|
||||
z
|
||||
);;
|
||||
|
||||
let translate_x (x, y, z) dx =
|
||||
(x +. dx, y, z);;
|
||||
|
||||
let translate_y (x, y, z) dy =
|
||||
(x, y +. dy, z);;
|
||||
|
||||
let translate_z (x, y, z) dz =
|
||||
(x, y +. 0.175, z +. dz);;
|
||||
(x, y, z +. dz);;
|
||||
|
||||
(* CUBE *)
|
||||
let vertecies = [
|
||||
@@ -70,38 +79,23 @@ let rec get_vertex v i =
|
||||
if i = 0 then x
|
||||
else get_vertex xs (i - 1);;
|
||||
|
||||
let draw_face (a, b, c, d) angle =
|
||||
let va = (get_vertex vertecies a) in
|
||||
let vb = (get_vertex vertecies b) in
|
||||
let vc = (get_vertex vertecies c) in
|
||||
let vd = (get_vertex vertecies d) in
|
||||
|
||||
let va = rotate_y va angle in
|
||||
let vb = rotate_y vb angle in
|
||||
let vc = rotate_y vc angle in
|
||||
let vd = rotate_y vd angle in
|
||||
|
||||
let va = rotate_x va angle in
|
||||
let vb = rotate_x vb angle in
|
||||
let vc = rotate_x vc angle in
|
||||
let vd = rotate_x vd angle in
|
||||
|
||||
let va = translate_z va 1.25 in
|
||||
let vb = translate_z vb 1.25 in
|
||||
let vc = translate_z vc 1.25 in
|
||||
let vd = translate_z vd 1.25 in
|
||||
let draw_face (a, b, c, d) v angle =
|
||||
let va = get_vertex v a in
|
||||
let vb = get_vertex v b in
|
||||
let vc = get_vertex v c in
|
||||
let vd = get_vertex v d in
|
||||
|
||||
draw_line va vb;
|
||||
draw_line vb vc;
|
||||
draw_line vc vd;
|
||||
draw_line vd va;;
|
||||
|
||||
let rec draw_cube faces angle =
|
||||
let rec draw_cube faces v angle =
|
||||
match faces with
|
||||
| [] -> ()
|
||||
| (a, b, c, d) :: fs ->
|
||||
draw_face (a, b, c, d) angle;
|
||||
draw_cube fs angle;;
|
||||
draw_face (a, b, c, d) v angle;
|
||||
draw_cube fs v angle;;
|
||||
(* END CUBE *)
|
||||
|
||||
(* SPHERE *)
|
||||
@@ -113,7 +107,7 @@ 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 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)
|
||||
@@ -160,9 +154,8 @@ let rec get_nth_vert e n =
|
||||
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)
|
||||
if j = sl 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;
|
||||
@@ -172,58 +165,66 @@ let draw_sphere v st sl =
|
||||
|
||||
let rec render_stacks j =
|
||||
let rec iter_stacks i e =
|
||||
if i = (st - 1) then e
|
||||
if i = st 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 ()
|
||||
if j = st + 1 then ()
|
||||
else render_stacks (j + 1)
|
||||
in
|
||||
|
||||
render_slices 0;
|
||||
render_stacks 0;;
|
||||
|
||||
let list_translate_z l =
|
||||
let list_transform t l d =
|
||||
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)
|
||||
| x :: xs -> translate (xs) (t x d :: n)
|
||||
in
|
||||
|
||||
translate l [];;
|
||||
|
||||
(* END SPHERE *)
|
||||
|
||||
let rec animate angle sv =
|
||||
let rec animate angle sv sqv =
|
||||
clear_graph ();
|
||||
|
||||
set_color (rgb 0 0 0);
|
||||
fill_rect 0 0 800 800;
|
||||
fill_rect 0 0 (int_of_float window_w) (int_of_float window_h);
|
||||
|
||||
set_color cyan;
|
||||
|
||||
(* draw_cube faces angle; *)
|
||||
draw_cube faces sqv angle;
|
||||
draw_sphere sv stacks slices;
|
||||
|
||||
Graphics.synchronize ();
|
||||
|
||||
animate (angle +. 0.0005) (list_translate_z (list_rotate_y (gen_sphere_vertecies 10 12 0.175) angle));;
|
||||
let nsv = gen_sphere_vertecies 10 12 0.175 in
|
||||
let nsv = list_transform rotate_y nsv (-1. *. angle) in
|
||||
let nsv = list_transform rotate_x nsv (-1. *. angle) in
|
||||
let nsv = list_transform translate_x nsv (sin angle /. -2.) in
|
||||
let nsv = list_transform translate_y nsv (cos angle /. -2.) in
|
||||
let nsv = list_transform translate_z nsv (1. +. sin(angle) /. 2.) in
|
||||
|
||||
let nsqv = vertecies in
|
||||
let nsqv = list_transform rotate_y nsqv angle in
|
||||
let nsqv = list_transform rotate_x nsqv angle in
|
||||
let nsqv = list_transform translate_x nsqv (sin angle) in
|
||||
let nsqv = list_transform translate_y nsqv (cos angle) in
|
||||
let nsqv = list_transform translate_z nsqv (2. +. (sin (-1. *. angle)) /. 2.) in
|
||||
|
||||
animate (angle +. 0.0005) nsv nsqv;;
|
||||
|
||||
let () =
|
||||
let size = " " ^ (string_of_float window_w) ^ "x" ^ (string_of_float window_h) ^ "+560+140" in
|
||||
Printf.printf "Size: %s\n" size;
|
||||
(* open_graph size; *)
|
||||
open_graph " 800x800+560+140";
|
||||
|
||||
auto_synchronize false;
|
||||
|
||||
animate 0. s_vertecies;
|
||||
animate 0. s_vertecies vertecies;
|
||||
|
||||
close_graph ()
|
||||
Reference in new issue
Block a user