diff --git a/a.out b/a.out index 3b127e8..3abcd31 100755 Binary files a/a.out and b/a.out differ diff --git a/graphs.cmi b/graphs.cmi index bfe425a..6828a5b 100644 Binary files a/graphs.cmi and b/graphs.cmi differ diff --git a/graphs.cmo b/graphs.cmo index f0d2f4d..b67e6f3 100644 Binary files a/graphs.cmo and b/graphs.cmo differ diff --git a/graphs.ml b/graphs.ml index 00f1d6d..8d75aea 100644 --- a/graphs.ml +++ b/graphs.ml @@ -152,7 +152,7 @@ let generate_type2_graph w h freq inf sup = 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 for i = 0 to gr.width -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 ; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -228,7 +228,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = set_line_width 8; for i = 0 to gr.width -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 is_weighted then begin set_color bcolor; @@ -240,7 +240,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -255,7 +255,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -270,7 +270,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -285,7 +285,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -300,7 +300,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -315,7 +315,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -330,7 +330,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -345,7 +345,7 @@ let another_type_of_graph_printing (gr : type2graph) r d is_weighted = else begin set_line_width 8; 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; @@ -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 j = 0 to gr.height -1 do 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 ; - 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) ; - 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 ; @@ -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 for i = 0 to gr.width -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) ; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -437,37 +437,37 @@ let another_type_of_dfs (gr : type2graph) r d = set_line_width 8; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -477,21 +477,21 @@ let another_type_of_dfs (gr : type2graph) r d = for i = 0 to gr.width -1 do for j = 0 to gr.height -1 do 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) ; - draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; - draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r + draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ; + draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r done done ; let draw_tile i j = set_line_width 5; 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; - 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); - 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 (* Now for the actual DFS *) @@ -504,21 +504,21 @@ let another_type_of_dfs (gr : type2graph) r d = draw_tile i j; 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; - 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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 *) set_line_width 4; 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_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; @@ -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 for i = 0 to gr.width -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) ; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -694,37 +694,37 @@ let another_type_of_bfs (gr : type2graph) r d = set_line_width 8; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -734,21 +734,21 @@ let another_type_of_bfs (gr : type2graph) r d = for i = 0 to gr.width -1 do for j = 0 to gr.height -1 do 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) ; - draw_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; - draw_integer (r + (2*r + d)*i) (r + (2*r + d)*j) gr.g.(i).(j).tag r + draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ; + draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) gr.g.(i).(j).tag r done done ; let draw_tile i j = set_line_width 5; 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; - 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); - 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 (* Actual BFS *) @@ -779,44 +779,44 @@ let another_type_of_bfs (gr : type2graph) r d = visited.(i).(j) <- true; 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; - 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 *) - 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; 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; 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; 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; 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; 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; 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; 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; 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 for i = 0 to gr.width -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 ; for i = 0 to gr.width -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 *) - 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; 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; 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; 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; 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; 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; 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; 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; done @@ -1063,7 +1063,7 @@ let another_type_of_dijkstra (gr : type2graph) r d = set_line_width 8; for i = 0 to gr.width -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 is_weighted then begin 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 j = 0 to gr.height -1 do 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 ; - 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) ; - 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 ; let draw_tile i j = set_line_width 5; 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; - 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); - 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 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 is_weighted then begin set_color bcolor; @@ -1294,58 +1294,58 @@ let another_type_of_dijkstra (gr : type2graph) r d = if mindists.(i).(j) > depth then begin mindists.(i).(j) <- depth; 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 ; - 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); - 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; - let node_xy = ((r + (2*r + d)*i0), (r + (2*r + d)*j0)) in - let dx = i - i0 and dy = j - j0 in - if (dx, dy) = (1, 1) then begin + let node_xy = ((r + (2*r + dx)*i0), (r + (2*r + dy)*j0)) in + let dxx = i - i0 and dyy = j - j0 in + if (dxx, dyy) = (1, 1) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(4) rsize; done_smth := true; end - else if (dx, dy) = (1, 0) then begin + else if (dxx, dyy) = (1, 0) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i0).(j0).edges.(5) rsize; done_smth := true; end - else if (dx, dy) = (1, -1) then begin + else if (dxx, dyy) = (1, -1) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(6) rsize; done_smth := true; end - else if (dx, dy) = (0, -1) then begin + else if (dxx, dyy) = (0, -1) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i0).(j0).edges.(7) rsize; done_smth := true; end - else if (dx, dy) = (-1, -1) then begin + else if (dxx, dyy) = (-1, -1) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i0).(j0).edges.(0) rsize; done_smth := true; end - else if (dx, dy) = (-1, 0) then begin + else if (dxx, dyy) = (-1, 0) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i0).(j0).edges.(1) rsize; done_smth := true; end - else if (dx, dy) = (-1, 1) then begin + else if (dxx, dyy) = (-1, 1) then begin set_color dcolor; set_line_width 3; draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i0).(j0).edges.(2) rsize; done_smth := true; end - else if (dx, dy) = (0, 1) then begin + else if (dxx, dyy) = (0, 1) then begin set_color dcolor; set_line_width 3; 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; 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; - 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 - 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 *) 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; 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; - 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; 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; - 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; 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; - 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; 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; - 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; 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; - 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; 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; - 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; 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; - 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; done; @@ -1413,17 +1413,45 @@ let another_type_of_dijkstra (gr : type2graph) r d = (* ----------------------- Tests --------------------------- *) -open_graph " 1200x800" ;; -set_window_title "Graphs" ;; +let main r = + 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 ;;*) -(*another_type_of_dfs type2 35 75 ;;*) -(*another_type_of_bfs type2 35 75 ;;*) -another_type_of_dijkstra type2 35 75 ;; + Stdlib.print_endline "Enter the height of the graph (use 6 for weighted): "; + let ht = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in -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 --------------------------- *)