65 lines
1.7 KiB
OCaml
65 lines
1.7 KiB
OCaml
#!/usr/bin/env ocaml
|
|
#load "unix.cma"
|
|
#load "graphics.cma"
|
|
open Graphics
|
|
|
|
let pi = 4.0 *. atan 1.0
|
|
let angle v max = float v /. max *. 2.0 *. pi
|
|
|
|
let () =
|
|
open_graph "";
|
|
set_window_title "OCaml Clock";
|
|
resize_window 256 256;
|
|
auto_synchronize false;
|
|
let w = size_x ()
|
|
and h = size_y () in
|
|
let rec loop () =
|
|
clear_graph ();
|
|
|
|
let point radius r a =
|
|
let x = int_of_float (radius *. sin a)
|
|
and y = int_of_float (radius *. cos a) in
|
|
fill_circle (w/2+x) (h/2+y) r;
|
|
in
|
|
set_color (rgb 192 192 192);
|
|
point 84.0 8 0.0;
|
|
point 84.0 8 (angle 90 360.0);
|
|
point 84.0 8 (angle 180 360.0);
|
|
point 84.0 8 (angle 270 360.0);
|
|
set_color (rgb 224 224 224);
|
|
point 84.0 6 (angle 30 360.0);
|
|
point 84.0 6 (angle 60 360.0);
|
|
point 84.0 6 (angle 120 360.0);
|
|
point 84.0 6 (angle 150 360.0);
|
|
point 84.0 6 (angle 210 360.0);
|
|
point 84.0 6 (angle 240 360.0);
|
|
point 84.0 6 (angle 300 360.0);
|
|
point 84.0 6 (angle 330 360.0);
|
|
|
|
set_line_width 9;
|
|
set_color (rgb 192 192 192);
|
|
draw_circle (w/2) (h/2) 100;
|
|
|
|
let tm = Unix.localtime (Unix.gettimeofday ()) in
|
|
let sec = angle tm.Unix.tm_sec 60.0 in
|
|
let min = angle tm.Unix.tm_min 60.0 in
|
|
let hour = angle (tm.Unix.tm_hour * 60 + tm.Unix.tm_min) (24.0 *. 60.0) in
|
|
let hour = hour *. 2.0 in
|
|
|
|
let hand t radius width color =
|
|
let x = int_of_float (radius *. sin t)
|
|
and y = int_of_float (radius *. cos t) in
|
|
set_line_width width;
|
|
set_color color;
|
|
moveto (w/2) (h/2); rlineto x y;
|
|
in
|
|
hand sec 90.0 2 (rgb 0 128 255);
|
|
hand min 82.0 4 (rgb 0 0 128);
|
|
hand hour 72.0 6 (rgb 255 0 128);
|
|
|
|
synchronize ();
|
|
Unix.sleep 1;
|
|
loop ()
|
|
in
|
|
try loop ()
|
|
with _ -> close_graph ()
|