User interface + adjustments to display locations

This commit is contained in:
Alexandre 2024-06-05 22:40:46 +02:00
parent 35e9885ccb
commit e0e60c8f3e
4 changed files with 183 additions and 155 deletions

BIN
a.out

Binary file not shown.

Binary file not shown.

Binary file not shown.

338
graphs.ml
View File

@ -152,7 +152,7 @@ let generate_type2_graph w h freq inf sup =
gr ;; gr ;;
let another_type_of_graph_printing (gr : type2graph) r d is_weighted = let another_type_of_graph_printing (gr : type2graph) r dx dy is_weighted =
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
@ -183,37 +183,37 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
set_color black ; set_color black ;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
end; end;
done done
@ -228,7 +228,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
set_line_width 8; set_line_width 8;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
if is_weighted then begin if is_weighted then begin
set_color bcolor; set_color bcolor;
@ -240,7 +240,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end end
end; end;
@ -255,7 +255,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end end
end; end;
@ -270,7 +270,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end end
end; end;
@ -285,7 +285,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end end
end; end;
@ -300,7 +300,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end end
end; end;
@ -315,7 +315,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end end
end; end;
@ -330,7 +330,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end end
end; end;
@ -345,7 +345,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
else begin else begin
set_line_width 8; set_line_width 8;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end end
end; end;
@ -356,11 +356,11 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black ; set_color black ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color colors.(i).(j) ; set_color colors.(i).(j) ;
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r
done done
done ; done ;
@ -370,7 +370,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted =
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
let another_type_of_dfs (gr : type2graph) r d = let another_type_of_dfs (gr : type2graph) r dx dy dt =
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
@ -398,37 +398,37 @@ let another_type_of_dfs (gr : type2graph) r d =
set_color (rgb 192 192 192) ; set_color (rgb 192 192 192) ;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
end; end;
done done
@ -437,37 +437,37 @@ let another_type_of_dfs (gr : type2graph) r d =
set_line_width 8; set_line_width 8;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
done done
@ -477,21 +477,21 @@ let another_type_of_dfs (gr : type2graph) r d =
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
set_color (rgb 192 192 192) ; set_color (rgb 192 192 192) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color (rgb 100 100 100) ; set_color (rgb 100 100 100) ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r
done done
done ; done ;
let draw_tile i j = let draw_tile i j =
set_line_width 5; set_line_width 5;
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black; set_color black;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color colors.(i).(j); set_color colors.(i).(j);
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r ; draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r ;
in in
(* Now for the actual DFS *) (* Now for the actual DFS *)
@ -504,21 +504,21 @@ let another_type_of_dfs (gr : type2graph) r d =
draw_tile i j; draw_tile i j;
set_color white; set_color white;
fill_circle (1200-r) (800-r) r; fill_circle (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) r;
set_color black; set_color black;
draw_integer (1200-r) (800-r) depth r; draw_integer (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) depth r;
Unix.sleepf 0.8; Unix.sleepf dt;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
draw_tile i j; draw_tile i j;
@ -528,10 +528,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
draw_tile i j; draw_tile i j;
@ -541,10 +541,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
draw_tile i j; draw_tile i j;
@ -554,10 +554,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
draw_tile i j; draw_tile i j;
@ -567,10 +567,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
draw_tile i j; draw_tile i j;
@ -580,10 +580,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
draw_tile i j; draw_tile i j;
@ -593,10 +593,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
draw_tile i j; draw_tile i j;
@ -606,10 +606,10 @@ let another_type_of_dfs (gr : type2graph) r d =
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *)
set_line_width 4; set_line_width 4;
set_color black; set_color black;
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
set_color colors.(i).(j); set_color colors.(i).(j);
set_line_width 8; set_line_width 8;
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
draw_tile i j; draw_tile i j;
@ -627,7 +627,7 @@ let another_type_of_dfs (gr : type2graph) r d =
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
let another_type_of_bfs (gr : type2graph) r d = let another_type_of_bfs (gr : type2graph) r dx dy gwd ght dt =
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
@ -655,37 +655,37 @@ let another_type_of_bfs (gr : type2graph) r d =
set_color (rgb 192 192 192) ; set_color (rgb 192 192 192) ;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
end; end;
done done
@ -694,37 +694,37 @@ let another_type_of_bfs (gr : type2graph) r d =
set_line_width 8; set_line_width 8;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|] ; draw_poly_line [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|] ;
end; end;
done done
@ -734,21 +734,21 @@ let another_type_of_bfs (gr : type2graph) r d =
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
set_color (rgb 192 192 192) ; set_color (rgb 192 192 192) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color (rgb 100 100 100) ; set_color (rgb 100 100 100) ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r
done done
done ; done ;
let draw_tile i j = let draw_tile i j =
set_line_width 5; set_line_width 5;
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black; set_color black;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color colors.(i).(j); set_color colors.(i).(j);
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r ; draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r ;
in in
(* Actual BFS *) (* Actual BFS *)
@ -779,44 +779,44 @@ let another_type_of_bfs (gr : type2graph) r d =
visited.(i).(j) <- true; visited.(i).(j) <- true;
set_color white; set_color white;
fill_circle (1200-r) (800-r) r; fill_circle (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) r;
set_color black; set_color black;
draw_integer (1200-r) (800-r) depth r; draw_integer (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) depth r;
Unix.sleepf 0.5; Unix.sleepf dt;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && (visited.(i-1).(j-1) = false) then begin (* SO *)
Queue.add (depth+1, i, j, i-1, j-1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; Queue.add (depth+1, i, j, i-1, j-1, [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|]) pq;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && (visited.(i-1).(j) = false) then begin (* O *)
Queue.add (depth+1, i, j, i-1, j, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq; Queue.add (depth+1, i, j, i-1, j, [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|]) pq;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && (visited.(i-1).(j+1) = false) then begin (* NO *)
Queue.add (depth+1, i, j, i-1, j+1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; Queue.add (depth+1, i, j, i-1, j+1, [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|]) pq;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && (visited.(i).(j+1) = false) then begin (* N *)
Queue.add (depth+1, i, j, i, j+1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; Queue.add (depth+1, i, j, i, j+1, [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|]) pq;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && (visited.(i+1).(j+1) = false) then begin (* NE *)
Queue.add (depth+1, i, j, i+1, j+1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq; Queue.add (depth+1, i, j, i+1, j+1, [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j+1))/3|]) pq;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && (visited.(i+1).(j) = false) then begin (* E *)
Queue.add (depth+1, i, j, i+1, j, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq; Queue.add (depth+1, i, j, i+1, j, [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*j)/3|]) pq;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && (visited.(i+1).(j-1) = false) then begin (* SE *)
Queue.add (depth+1, i, j, i+1, j-1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; Queue.add (depth+1, i, j, i+1, j-1, [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|]) pq;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && (visited.(i).(j-1) = false) then begin (* S *)
Queue.add (depth+1, i, j, i, j-1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq; Queue.add (depth+1, i, j, i, j-1, [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dx)*i)/3, (2 * (snd node_xy) + r + (2*r + dy)*(j-1))/3|]) pq;
end end
end; end;
done; done;
@ -985,7 +985,7 @@ let pq_init a default_priority =
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
(* ------------------------------------------------------------*) (* ------------------------------------------------------------*)
let another_type_of_dijkstra (gr : type2graph) r d = let another_type_of_dijkstra (gr : type2graph) r dx dy dt gwd ght =
let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in let colors = Array.make_matrix gr.width gr.height (rgb 0 0 0) in
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
@ -1016,37 +1016,37 @@ let another_type_of_dijkstra (gr : type2graph) r d =
set_color black ; set_color black ;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i-1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j+1))|] ;
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*j)|] ;
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *)
draw_poly_line [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*(i+1)), (r + (2*r + dy)*(j-1))|] ;
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *)
draw_poly_line [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|] ; draw_poly_line [|node_xy; (r + (2*r + dx)*i), (r + (2*r + dy)*(j-1))|] ;
end; end;
done done
@ -1063,7 +1063,7 @@ let another_type_of_dijkstra (gr : type2graph) r d =
set_line_width 8; set_line_width 8;
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
if is_weighted then begin if is_weighted then begin
set_color bcolor; set_color bcolor;
@ -1151,26 +1151,26 @@ let another_type_of_dijkstra (gr : type2graph) r d =
for i = 0 to gr.width -1 do for i = 0 to gr.width -1 do
for j = 0 to gr.height -1 do for j = 0 to gr.height -1 do
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black ; set_color black ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r
done done
done ; done ;
let draw_tile i j = let draw_tile i j =
set_line_width 5; set_line_width 5;
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black; set_color black;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color colors.(i).(j); set_color colors.(i).(j);
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r ; draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r ;
let fcolor = rgb 255 0 0 in let fcolor = rgb 255 0 0 in
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *)
if is_weighted then begin if is_weighted then begin
set_color bcolor; set_color bcolor;
@ -1294,58 +1294,58 @@ let another_type_of_dijkstra (gr : type2graph) r d =
if mindists.(i).(j) > depth then begin if mindists.(i).(j) > depth then begin
mindists.(i).(j) <- depth; mindists.(i).(j) <- depth;
set_color (rgb 48 48 48) ; set_color (rgb 48 48 48) ;
fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color black ; set_color black ;
draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ;
set_color colors.(i).(j); set_color colors.(i).(j);
draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) depth r draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) depth r
end; end;
let node_xy = ((r + (2*r + d)*i0), (r + (2*r + d)*j0)) in let node_xy = ((r + (2*r + dx)*i0), (r + (2*r + dy)*j0)) in
let dx = i - i0 and dy = j - j0 in let dxx = i - i0 and dyy = j - j0 in
if (dx, dy) = (1, 1) then begin if (dxx, dyy) = (1, 1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(4) rsize; draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(4) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (1, 0) then begin else if (dxx, dyy) = (1, 0) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i0).(j0).edges.(5) rsize; draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i0).(j0).edges.(5) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (1, -1) then begin else if (dxx, dyy) = (1, -1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(6) rsize; draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(6) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (0, -1) then begin else if (dxx, dyy) = (0, -1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i0).(j0).edges.(7) rsize; draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i0).(j0).edges.(7) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (-1, -1) then begin else if (dxx, dyy) = (-1, -1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(0) rsize; draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(0) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (-1, 0) then begin else if (dxx, dyy) = (-1, 0) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i0).(j0).edges.(1) rsize; draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i0).(j0).edges.(1) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (-1, 1) then begin else if (dxx, dyy) = (-1, 1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(2) rsize; draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(2) rsize;
done_smth := true; done_smth := true;
end end
else if (dx, dy) = (0, 1) then begin else if (dxx, dyy) = (0, 1) then begin
set_color dcolor; set_color dcolor;
set_line_width 3; set_line_width 3;
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i0).(j0).edges.(3) rsize; draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i0).(j0).edges.(3) rsize;
@ -1353,53 +1353,53 @@ let another_type_of_dijkstra (gr : type2graph) r d =
end; end;
set_color white; set_color white;
fill_circle (1200-r) (800-r) r; fill_circle (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) r;
set_color black; set_color black;
draw_integer (1200-r) (800-r) depth r; draw_integer (r + (2*r + dx)*(gr.width/2)) (r + (2*r + dy)*(gr.height/2)) depth r;
if !done_smth then if !done_smth then
Unix.sleepf 0.5; Unix.sleepf dt;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in
if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(0) = false then begin (* SO *) if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(0) = false then begin (* SO *)
loops.(i).(j).(0) <- true; loops.(i).(j).(0) <- true;
pq_add (i, j, i-1, j-1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(0)); pq_add (i, j, i-1, j-1, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(0));
end; end;
if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(1) = false then begin (* O *) if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(1) = false then begin (* O *)
loops.(i).(j).(1) <- true; loops.(i).(j).(1) <- true;
pq_add (i, j, i-1, j, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(1)); pq_add (i, j, i-1, j, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(1));
end; end;
if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(2) = false then begin (* NO *) if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(2) = false then begin (* NO *)
loops.(i).(j).(2) <- true; loops.(i).(j).(2) <- true;
pq_add (i, j, i-1, j+1, [|node_xy; (r + (2*r + d)*(i-1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(2)); pq_add (i, j, i-1, j+1, [|node_xy; (r + (2*r + dxx)*(i-1)), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i-1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(2));
end; end;
if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(3) = false then begin (* N *) if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(3) = false then begin (* N *)
loops.(i).(j).(3) <- true; loops.(i).(j).(3) <- true;
pq_add (i, j, i, j+1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(3)); pq_add (i, j, i, j+1, [|node_xy; (r + (2*r + dxx)*i), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*i)/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(3));
end; end;
if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(4) = false then begin (* NE *) if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(4) = false then begin (* NE *)
loops.(i).(j).(4) <- true; loops.(i).(j).(4) <- true;
pq_add (i, j, i+1, j+1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(4)); pq_add (i, j, i+1, j+1, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*(j+1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j+1))/3|]) pq (depth+gr.g.(i).(j).edges.(4));
end; end;
if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(5) = false then begin (* E *) if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(5) = false then begin (* E *)
loops.(i).(j).(5) <- true; loops.(i).(j).(5) <- true;
pq_add (i, j, i+1, j, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(5)); pq_add (i, j, i+1, j, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*j)|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*j)/3|]) pq (depth+gr.g.(i).(j).edges.(5));
end; end;
if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(6) = false then begin (* SE *) if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(6) = false then begin (* SE *)
loops.(i).(j).(6) <- true; loops.(i).(j).(6) <- true;
pq_add (i, j, i+1, j-1, [|node_xy; (r + (2*r + d)*(i+1)), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(6)); pq_add (i, j, i+1, j-1, [|node_xy; (r + (2*r + dxx)*(i+1)), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*(i+1))/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(6));
end; end;
if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(7) = false then begin (* S *) if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) && ((i >= 0) && (j >= 0) && (i < gr.width) && (j < gr.height)) && loops.(i).(j).(7) = false then begin (* S *)
loops.(i).(j).(7) <- true; loops.(i).(j).(7) <- true;
pq_add (i, j, i, j-1, [|node_xy; (r + (2*r + d)*i), (r + (2*r + d)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + d)*i)/3, (2 * (snd node_xy) + r + (2*r + d)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(7)); pq_add (i, j, i, j-1, [|node_xy; (r + (2*r + dxx)*i), (r + (2*r + dyy)*(j-1))|], [|node_xy; (2 * (fst node_xy) + r + (2*r + dxx)*i)/3, (2 * (snd node_xy) + r + (2*r + dyy)*(j-1))/3|]) pq (depth+gr.g.(i).(j).edges.(7));
end end
end; end;
done; done;
@ -1413,17 +1413,45 @@ let another_type_of_dijkstra (gr : type2graph) r d =
(* ----------------------- Tests --------------------------- *) (* ----------------------- Tests --------------------------- *)
open_graph " 1200x800" ;; let main r =
set_window_title "Graphs" ;; Stdlib.print_endline "Enter the width of the graph (use 8 for weighted): ";
let wd = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
let type2 = generate_type2_graph 7 5 40 1 10 ;; if wd <= 0 then failwith "Error : invalid input";
(*another_type_of_graph_printing type2 35 100 true ;;*) Stdlib.print_endline "Enter the height of the graph (use 6 for weighted): ";
(*another_type_of_dfs type2 35 75 ;;*) let ht = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
(*another_type_of_bfs type2 35 75 ;;*)
another_type_of_dijkstra type2 35 75 ;;
close_graph () ;; if ht <= 0 then failwith "Error : invalid input";
Stdlib.print_endline "Is the grap weighted ? (0/1)";
let is_weighted = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
let weighted = ref false in
if is_weighted = 1 then weighted := true;
Stdlib.print_endline "Enter the mode :\n0 for display\n1 for BFS\n2 for DFS\n3 for Dijkstra\n";
let choice = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in
open_graph " 1500x1000" ;
set_window_title "Graphs" ;
let gwd = 1500-r and ght = 1000-r in
let offset_x = (gwd - r)/(wd-1) - 2*r in
let offset_y = (ght - r)/(ht-1) - 2*r in
let type2 = generate_type2_graph wd ht r 1 60 in
let dt = 0.25 in
if choice = 0 then begin another_type_of_graph_printing type2 r offset_x offset_y !weighted; close_graph () end
else if choice = 1 then begin another_type_of_dfs type2 r offset_x offset_y dt ; close_graph () end
else if choice = 2 then begin another_type_of_bfs type2 r offset_x offset_y gwd ght dt ; close_graph () end
else if choice = 3 then begin another_type_of_dijkstra type2 r offset_x offset_y dt gwd ght ; close_graph () end
else failwith "Error : invalid input";;
main 35;;
(* ----------------------- Tests --------------------------- *) (* ----------------------- Tests --------------------------- *)