let rec print_mat m = for i = 0 to (Array.length m)-1 do print_char ' '; for j = 0 to (Array.length m.(i))-1 do if m.(i).(j) <> -1 then print_int m.(i).(j) else print_char '_'; print_char ' '; print_char '|'; print_char ' '; done; print_char '\n'; for j = 0 to (Array.length m.(i))-1 do print_char '-'; print_char '-'; print_char '-'; print_char '+'; done; print_char '\n'; done ;; let pi = 3.14159265358979343 ;; let abs x = if x >= 0 then x else -x ;; let absf x = if x >= 0. then x else -1. *. x ;; let draw_line_bresenham mat x1 y1 x2 y2 neutral lnc cutoff = let slope = ref 0. in if x2 <> x1 || y2 <> y1 then slope := (float_of_int (y2 - y1) /. float_of_int (x2 - x1)) else (); if absf (!slope) < 1. then if x1 < x2 then for k = x1 to x2 do let cur_y = ref ((!slope) *. float_of_int (k - x1) +. float_of_int y1) in if !slope = 0. then cur_y := float_of_int y2 else (); if mat.(k).(int_of_float (!cur_y)) = neutral || mat.(k).(int_of_float (!cur_y)) = (-2) then if x2 - k > cutoff then mat.(k).(int_of_float (!cur_y)) <- (-2) else mat.(k).(int_of_float (!cur_y)) <- (-3) else () done else for k = x1 downto x2 do let cur_y = ref ((!slope) *. float_of_int (k - x1) +. float_of_int y1) in if !slope = 0. then cur_y := float_of_int y2 else (); if mat.(k).(int_of_float (!cur_y)) = neutral then if k - x2 > cutoff then mat.(k).(int_of_float (!cur_y)) <- (-2) else mat.(k).(int_of_float (!cur_y)) <- (-3) else () done else if y1 < y2 then for l = y1 to y2 do let cur_x = ref (float_of_int x2) in if (!slope) <> 1.0 /. 0.0 && (!slope) <> (-. 1.) /. 0. then cur_x := ((float_of_int l) +. ((!slope) *. (float_of_int x1) -. (float_of_int y1))) /. (!slope) else (); if mat.(int_of_float (!cur_x)).(l) = neutral || mat.(int_of_float (!cur_x)).(l) = (-2) then if y2 - l > cutoff then mat.(int_of_float (!cur_x)).(l) <- (-2) else mat.(int_of_float (!cur_x)).(l) <- (-3) else () done else for l = y1 downto y2 do let cur_x = ref (float_of_int x2) in if (!slope) <> 1.0 /. 0.0 && (!slope) <> (-. 1.) /. 0. then cur_x := ((float_of_int l) +. ((!slope) *. (float_of_int x1) -. (float_of_int y1))) /. (!slope) else (); if mat.(int_of_float (!cur_x)).(l) = neutral || mat.(int_of_float (!cur_x)).(l) = (-2) then if l - y2 > cutoff then mat.(int_of_float (!cur_x)).(l) <- (-2) else mat.(int_of_float (!cur_x)).(l) <- (-3) else () done;; let display mat neutral lnc lnf = for i = 0 to (Array.length mat -1) do for j = 0 to (Array.length mat.(i) -1) do if mat.(i).(j) = (-5) then Printf.printf "#" else if mat.(i).(j) <> neutral && mat.(i).(j) <> lnc && mat.(i).(j) <> lnf then Printf.printf "%d" mat.(i).(j) else if mat.(i).(j) = lnc then Printf.printf "." else if mat.(i).(j) = lnf then Printf.printf "X" else Printf.printf " " done; print_char '\n' done;; let extend mat i j = let ni = Array.length mat in let nj = Array.length mat.(0) in let s = (-5) in if i+1 >= 0 && i+1 < ni then begin mat.(i+1).(j) <- s; if j+1 >= 0 && j+1 < nj then mat.(i+1).(j+1) <- s else (); if j-1 >= 0 && j-1 < nj then mat.(i+1).(j-1) <- s else () end else (); if i-1 >= 0 && i-1 < ni then begin mat.(i-1).(j) <- s; if j+1 >= 0 && j+1 < nj then mat.(i-1).(j+1) <- s else (); if j-1 >= 0 && j-1 < nj then mat.(i-1).(j-1) <- s else () end else (); if j+1 >= 0 && j+1 < nj then mat.(i).(j+1) <- s else (); if j-1 >= 0 && j-1 < nj then mat.(i).(j-1) <- s else () ;; let extremely_fancy_graph_printing g size = let px = Array.make (size) [||] in for i = 0 to (size-1) do px.(i) <- Array.make (3*size) (-1) done; let coords = Array.make size (0, 0) in (* placing the points on the trig circle *) for k = 0 to Array.length g - 1 do let theta = 2. *. pi *. (float_of_int k) /. (float_of_int (Array.length g)) in let i = int_of_float ((float_of_int size) /. 2.) + int_of_float ((float_of_int size) /. 2.05 *. cos theta) in let j = int_of_float ((float_of_int size) /. 2.) + int_of_float ((float_of_int size) /. 2.05 *. sin theta) in px.(i).(3*j) <- k; extend px i (3*j); coords.(k) <- (i, 3*j); done; (* for i = 0 to Array.length g - 2 do draw_line_bresenham px (fst coords.(i)) (snd coords.(i)) (fst coords.(i+1)) (snd coords.(i+1)) (-1) done; *) for i = 0 to Array.length g -1 do for j = 0 to Array.length g.(i) -1 do (*Printf.printf "[%d %d]\n" i g.(i).(j);*) draw_line_bresenham px (fst coords.(i)) (snd coords.(i)) (fst coords.(g.(i).(j))) (snd coords.(g.(i).(j))) (-1) (-3) 6 done done; display px (-1) (-2) (-3) ;; let gr = [|[|3|]; [|4|]; [|0; 3; 4|]; [|0; 2|]; [|1; 2|]; [|0; 4|]|] ;; (*print_mat gr ;;*) extremely_fancy_graph_printing gr 40 ;