Initial commit
This commit is contained in:
commit
96aabd69bf
Binary file not shown.
Binary file not shown.
|
@ -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 ;
|
Loading…
Reference in New Issue