diff --git a/a.out b/a.out index c2a813e..eef7944 100755 Binary files a/a.out and b/a.out differ diff --git a/graphs.cmi b/graphs.cmi index 9fb1c31..a445c85 100644 Binary files a/graphs.cmi and b/graphs.cmi differ diff --git a/graphs.cmo b/graphs.cmo index 2db9ee4..07cb7eb 100644 Binary files a/graphs.cmo and b/graphs.cmo differ diff --git a/graphs.ml b/graphs.ml index 5bd3df9..9d4d75c 100644 --- a/graphs.ml +++ b/graphs.ml @@ -824,7 +824,11 @@ let another_type_of_bfs (gr : type2graph) r dx dy gwd ght dt = with | Stdlib.Queue.Empty -> ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; -type 'a dyna = {mutable memlen : int ; mutable len : int ; a : ('a * int) array};; +(* --------------------------------------------------------------- *) +(* ---AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA--- *) +(* --------------------------------------------------------------- *) + +type 'a dyna = {mutable memlen : int ; mutable len : int ; a : ('a * int) array} ;; let create_d n i = let res = {memlen = n; len = 0; a = Array.make n (i, 0)} in res ;; @@ -884,8 +888,266 @@ let update_p da elt newp = end done;; -let me_out_of_this_thing (gr : type2graph) = +let me_out_of_this_thing (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 + if (i*gr.width + j) mod 6 = 0 then + colors.(i).(j) <- rgb 0 0 200 + + else if (i*gr.width + j) mod 6 = 1 then + colors.(i).(j) <- rgb 0 200 0 + + else if (i*gr.width + j) mod 6 = 2 then + colors.(i).(j) <- rgb 0 200 200 + + else if (i*gr.width + j) mod 6 = 3 then + colors.(i).(j) <- rgb 200 0 0 + + else if (i*gr.width + j) mod 6 = 4 then + colors.(i).(j) <- rgb 200 0 200 + + else + colors.(i).(j) <- rgb 200 200 0 + done + done; + + let roff = (9*r)/8 in + let roff2 = (7*r)/5 in + let rsize = (3*r)/4 in + let wcolor = rgb 255 255 255 in + let bcolor = rgb 150 150 150 in + let ncolor = rgb 150 150 150 in + + let xdists = [|-roff ; -roff2; -roff; 0; roff; roff2; roff; 0|] in + let ydists = [|-roff; 0; roff ; roff2; roff; 0; -roff ;-roff2|] in + + set_line_width 4; + set_color (rgb 122 122 122) ; + for i = 0 to gr.width -1 do + for j = 0 to gr.height -1 do + 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 [|(fst node_xy + xdists.(0), snd node_xy + ydists.(0)); (xdists.(4) + r + (2*r + dx)*(i-1)), (ydists.(4) + r + (2*r + dy)*(j-1))|] ; + end; + + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) + draw_poly_line [|(fst node_xy + xdists.(1), snd node_xy + ydists.(1)); (xdists.(5) + r + (2*r + dx)*(i-1)), (ydists.(5) + 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 [|(fst node_xy + xdists.(2), snd node_xy + ydists.(2)); (xdists.(6) + r + (2*r + dx)*(i-1)), (ydists.(6) + 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 [|(fst node_xy + xdists.(3), snd node_xy + ydists.(3)); (xdists.(7) + r + (2*r + dx)*i), (ydists.(7) + 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 [|(fst node_xy + xdists.(4), snd node_xy + ydists.(4)); (xdists.(0) + r + (2*r + dx)*(i+1)), (ydists.(0) + 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 [|(fst node_xy + xdists.(5), snd node_xy + ydists.(5)); (xdists.(1) + r + (2*r + dx)*(i+1)), (ydists.(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 [|(fst node_xy + xdists.(6), snd node_xy + ydists.(6)); (xdists.(2) + r + (2*r + dx)*(i+1)), (ydists.(2) + r + (2*r + dy)*(j-1))|] ; + end; + + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) + draw_poly_line [|(fst node_xy + xdists.(7), snd node_xy + ydists.(7)); (xdists.(3) + r + (2*r + dx)*i), (ydists.(3) + r + (2*r + dy)*(j-1))|] ; + end; + + done + done; + + set_line_width 4; + for i = 0 to gr.width -1 do + for j = 0 to gr.height -1 do + 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 *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy - roff) (snd node_xy - roff) (3*rsize/4) ; + if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy - roff) (snd node_xy - roff) gr.g.(i).(j).edges.(0) rsize; + end; + + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy - roff2) (snd node_xy) (3*rsize/4) ; + if (i > 0) && gr.g.(i).(j).edges.(1) <> (-1) then begin (* O *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i).(j).edges.(1) rsize; + end; + + if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy - roff) (snd node_xy + roff) (3*rsize/4) ; + if (i > 0 && j < gr.height -1) && gr.g.(i).(j).edges.(2) <> (-1) then begin (* NO *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy - roff) (snd node_xy + roff) gr.g.(i).(j).edges.(2) rsize; + end; + + if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy) (snd node_xy + roff2) (3*rsize/4) ; + if (j < gr.height -1) && gr.g.(i).(j).edges.(3) <> (-1) then begin (* N *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i).(j).edges.(3) rsize; + end; + + if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy + roff) (snd node_xy + roff) (3*rsize/4) ; + if (i < gr.width-1 && j < gr.height -1) && gr.g.(i).(j).edges.(4) <> (-1) then begin (* NE *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy + roff) (snd node_xy + roff) gr.g.(i).(j).edges.(4) rsize; + end; + + if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy + roff2) (snd node_xy) (3*rsize/4) ; + if (i < gr.width-1) && gr.g.(i).(j).edges.(5) <> (-1) then begin (* E *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i).(j).edges.(5) rsize; + end; + + if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy + roff) (snd node_xy - roff) (3*rsize/4) ; + if (i < gr.width-1 && j > 0) && gr.g.(i).(j).edges.(6) <> (-1) then begin (* SE *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy + roff) (snd node_xy - roff) gr.g.(i).(j).edges.(6) rsize; + end; + + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) + set_color bcolor; + end else begin + set_color ncolor ; + end; + fill_circle (fst node_xy) (snd node_xy - roff2) (3*rsize/4) ; + if (j > 0) && gr.g.(i).(j).edges.(7) <> (-1) then begin (* S *) + set_color wcolor; + set_line_width 3; + draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i).(j).edges.(7) rsize; + end; + + done + done; + + set_line_width 5; + for i = 0 to gr.width -1 do + for j = 0 to gr.height -1 do + set_color (rgb 32 32 32) ; + fill_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ; + set_color (rgb 100 100 100) ; + draw_circle (r + (2*r + dx)*i) (r + (2*r + dy)*j) r ; + done + done ; + + let draw_tile i j p = + set_line_width 5; + set_color colors.(i).(j); + draw_integer (r + (2*r + dx)*i) (r + (2*r + dy)*j) p r ; + in + + let offx = [|-1; -1; -1; 0; 1; 1; 1; 0|] in + let offy = [|-1; 0; 1; 1; 1; 0; -1; -1|] in + let w = gr.width and h = gr.height in + let is_valid i j = + (i >= 0) && (j >= 0) && (i < w) && (j < h) + in + + let draw_path i j side = + let node_xy = ((r + (2*r + dx)*i), (r + (2*r + dy)*j)) in + set_color (rgb 32 220 32); + if side = 0 then begin (* SO *) + draw_poly_line [|(fst node_xy + xdists.(0), snd node_xy + ydists.(0)); (xdists.(4) + r + (2*r + dx)*(i-1)), (ydists.(4) + r + (2*r + dy)*(j-1))|] ; + end; + + if side = 1 then begin (* O *) + draw_poly_line [|(fst node_xy + xdists.(1), snd node_xy + ydists.(1)); (xdists.(5) + r + (2*r + dx)*(i-1)), (ydists.(5) + r + (2*r + dy)*j)|] ; + end; + + if side = 2 then begin (* NO *) + draw_poly_line [|(fst node_xy + xdists.(2), snd node_xy + ydists.(2)); (xdists.(6) + r + (2*r + dx)*(i-1)), (ydists.(6) + r + (2*r + dy)*(j+1))|] ; + end; + + if side = 3 then begin (* N *) + draw_poly_line [|(fst node_xy + xdists.(3), snd node_xy + ydists.(3)); (xdists.(7) + r + (2*r + dx)*i), (ydists.(7) + r + (2*r + dy)*(j+1))|] ; + end; + + if side = 4 then begin (* NE *) + draw_poly_line [|(fst node_xy + xdists.(4), snd node_xy + ydists.(4)); (xdists.(0) + r + (2*r + dx)*(i+1)), (ydists.(0) + r + (2*r + dy)*(j+1))|] ; + end; + + if side = 5 then begin (* E *) + draw_poly_line [|(fst node_xy + xdists.(5), snd node_xy + ydists.(5)); (xdists.(1) + r + (2*r + dx)*(i+1)), (ydists.(1) + r + (2*r + dy)*j)|] ; + end; + + if side = 6 then begin (* SE *) + draw_poly_line [|(fst node_xy + xdists.(6), snd node_xy + ydists.(6)); (xdists.(2) + r + (2*r + dx)*(i+1)), (ydists.(2) + r + (2*r + dy)*(j-1))|] ; + end; + + if side = 7 then begin (* S *) + draw_poly_line [|(fst node_xy + xdists.(7), snd node_xy + ydists.(7)); (xdists.(3) + r + (2*r + dx)*i), (ydists.(3) + r + (2*r + dy)*(j-1))|] ; + end; if (i > 0 && j > 0) && gr.g.(i).(j).edges.(0) <> (-1) then begin (* SO *) + set_color bcolor; + end ; + + if side >= 0 then begin + set_color black; + fill_circle (fst node_xy + xdists.(side)) (snd node_xy + ydists.(side)) (3*rsize/4) ; + set_color (rgb 32 255 32); + set_line_width 3; + draw_integer (fst node_xy + xdists.(side)) (snd node_xy + ydists.(side)) gr.g.(i).(j).edges.(side) rsize; + + let side2 = (side + 4) mod 8 in + let node_xy2 = ((r + (2*r + dx)*(i + offx.(side))), (r + (2*r + dy)*(j + offy.(side)))) in + set_color black; + fill_circle (fst node_xy2 + xdists.(side2)) (snd node_xy2 + ydists.(side2)) (3*rsize/4) ; + set_color (rgb 255 32 32); + set_line_width 3; + + if is_valid (i + offx.(side)) (j + offy.(side)) then + let reversepond = gr.g.(i + offx.(side)).(j + offy.(side)).edges.(side2) in + if reversepond <> -1 then + draw_integer (fst node_xy2 + xdists.(side2)) (snd node_xy2 + ydists.(side2)) reversepond rsize + end + in + + (* Actual algo *) let disttab = Array.make_matrix w h (-1) in let pq = create_d (w*h) (0, 0) in @@ -896,40 +1158,54 @@ let me_out_of_this_thing (gr : type2graph) = done done; - let is_valid i j = - (i >= 0) && (j >= 0) && (i < w) && (j < h) - in - - let offx = [|-1; -1; -1; 0; 1; 1; 1; 0|] in - let offy = [|-1; 0; 1; 1; 1; 0; -1; -1|] in + let dirtab = Array.make_matrix w h (-1) in + let origintab = Array.make_matrix w h (0, 0) in update_p pq (w/2, h/2) 0; - while (is_empty_d pq) = false do + let out_of_connex = ref false in + + let srci = ref (w/2) and srcj = ref (h/2) in + + while !out_of_connex = false && (is_empty_d pq) = false do let ((i, j), p) = remove_min_d pq in disttab.(i).(j) <- p; + draw_path (fst origintab.(i).(j)) (snd origintab.(i).(j)) dirtab.(i).(j); - for nb = 0 to 7 do - let ni = i + offx.(nb) in - let nj = j + offy.(nb) in + if p <> -1 then begin + for nb = 0 to 7 do + let ni = i + offx.(nb) in + let nj = j + offy.(nb) in - if is_valid ni nj then - if disttab.(ni).(nj) = (-1) && gr.g.(ni).(nj).edges.(nb) <> (-1) then begin - let newdist = p + gr.g.(i).(j).edges.(nb) in - let oldp = get_p pq (ni, nj) in - if oldp > newdist then - update_p pq (ni, nj) newdist - end - done + if is_valid ni nj then + if disttab.(ni).(nj) = (-1) && gr.g.(i).(j).edges.(nb) > 0 then begin + let newdist = p + gr.g.(i).(j).edges.(nb) in + let oldp = get_p pq (ni, nj) in + if oldp > newdist then begin + update_p pq (ni, nj) newdist; + dirtab.(ni).(nj) <- nb; + origintab.(ni).(nj) <- (i, j) + end + end + done; + + draw_tile i j p; + srci := i; + srcj := j; + Unix.sleepf dt ; + end + else + out_of_connex := true; done; - for j = h-1 downto 0 do + (*for j = h-1 downto 0 do for i = 0 to w-1 do Printf.printf "{[%d %d] : %d} " i j disttab.(i).(j) done; print_char '\n' done ; - Stdlib.print_endline "--" ;; + Stdlib.print_endline "--";*) + ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; (* ------------------------------------------------------------*) (* ------------------------------------------------------------*) @@ -974,14 +1250,12 @@ let main r = let type2 = generate_type2_graph wd ht !density 1 10 in - let dt = 0.25 in - - me_out_of_this_thing type2; + let dt = 0.3 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 () end + else if choice = 3 then begin me_out_of_this_thing type2 r offset_x offset_y dt ; close_graph () end else failwith "Error : invalid input"; ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity);;