commit 96aabd69bf0898b4f34e2c2553b51a40546b1a1c Author: alexandre Date: Sat May 18 23:55:01 2024 +0200 Initial commit diff --git a/a.out b/a.out new file mode 100644 index 0000000..31b023e Binary files /dev/null and b/a.out differ diff --git a/pretty_printing.cmi b/pretty_printing.cmi new file mode 100644 index 0000000..2cf0eea Binary files /dev/null and b/pretty_printing.cmi differ diff --git a/pretty_printing.cmo b/pretty_printing.cmo new file mode 100644 index 0000000..510be2f Binary files /dev/null and b/pretty_printing.cmo differ diff --git a/pretty_printing.ml b/pretty_printing.ml new file mode 100644 index 0000000..64bb81c --- /dev/null +++ b/pretty_printing.ml @@ -0,0 +1,176 @@ +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 ; \ No newline at end of file