diff --git a/a.out b/a.out index 5aa98bf..b8907ca 100755 Binary files a/a.out and b/a.out differ diff --git a/graphs.cmi b/graphs.cmi index d42af4b..f857d9e 100644 Binary files a/graphs.cmi and b/graphs.cmi differ diff --git a/graphs.cmo b/graphs.cmo index b659973..faa35b9 100644 Binary files a/graphs.cmo and b/graphs.cmo differ diff --git a/graphs.ml b/graphs.ml index 4757f99..b593a18 100644 --- a/graphs.ml +++ b/graphs.ml @@ -1,5 +1,7 @@ open Graphics ;; +Random.self_init () ;; + let pi = 3.14159265358979343 ;; let rec ln10 n = match n with @@ -44,6 +46,11 @@ let draw_integer x0 y n0 r = let identity n = n ;; +let square x = x *. x ;; + +let norm_int v1 v2 = + Float.sqrt (square (float_of_int ((fst v2) - (fst v1))) +. square (float_of_int ((snd v2) - -snd v1))) ;; + let improved_pretty_printing g wd ht r = let n = Array.length g in let coords = Array.make n (0, 0) in @@ -73,7 +80,7 @@ let improved_pretty_printing g wd ht r = done done; - set_line_width 12 ; + set_line_width 8 ; for k = 0 to n-1 do set_color colors.(k) ; for l = 0 to (Array.length g.(k))-1 do @@ -98,11 +105,166 @@ let improved_pretty_printing g wd ht r = ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; +(* Another version *) +type node = {tag : int; edges : int array} ;; + +type type2graph = {width : int ; height : int ; g : node array array} ;; +(* +array is length 8 and indicate if there-s a path with the nodes +[| SO ; O ; NO ; N ; NE ; E ; SE ; S |] +*) + + +let generate_type2_graph w h freq inf sup = + + let weighted_d100 i = + let res = Random.int 100 in + if res <= freq then res else (-1) + in + + let gr = {width = w ; height = h ; g = Array.make w [||]} in + for i = 0 to w-1 do + let init_fct j = {tag = i*h + j; edges = Array.init 8 weighted_d100} + in + + gr.g.(i) <- Array.init h init_fct; + done; + + gr ;; + +let another_type_of_graph_printing (gr : type2graph) r d = + 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 7 = 0 then + colors.(i).(j) <- rgb 0 0 200 + + else if (i*gr.width + j) mod 7 = 1 then + colors.(i).(j) <- rgb 0 200 0 + + else if (i*gr.width + j) mod 7 = 2 then + colors.(i).(j) <- rgb 0 200 200 + + else if (i*gr.width + j) mod 7 = 3 then + colors.(i).(j) <- rgb 200 0 0 + + else if (i*gr.width + j) mod 7 = 4 then + colors.(i).(j) <- rgb 200 0 200 + + else if (i*gr.width + j) mod 7 = 5 then + colors.(i).(j) <- rgb 200 200 0 + + else + colors.(i).(j) <- rgb 200 200 200 + done + done; + + set_line_width 4; + 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 + 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))|] ; + 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)|] ; + 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))|] ; + 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))|] ; + 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))|] ; + 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)|] ; + 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))|] ; + 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))|] ; + end; + + done + done; + + set_line_width 8; + for i = 0 to gr.width -1 do + for j = 0 to gr.height -1 do + set_color colors.(i).(j) ; + let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*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|] ; + 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|] ; + 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|] ; + 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|] ; + 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|] ; + 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|] ; + 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|] ; + 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|] ; + 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 48 48 48) ; + fill_circle (r + (2*r + d)*i) (r + (2*r + d)*j) r ; + set_color black ; + draw_circle (r + (2*r + d)*i) (r + (2*r + d)*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 + done + done ; + + ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; (* ----------------------- Tests --------------------------- *) -Random.self_init ;; -Random.self_init ;; +open_graph " 1200x800" ;; +set_window_title "Graphs" ;; + +let type2 = generate_type2_graph 8 6 40 1 1 ;; + +another_type_of_graph_printing type2 35 75 ;; + +close_graph () ;; + +(* ----------------------- Tests --------------------------- *) open_graph " 1200x800" ;; set_window_title "Graphs" ;; @@ -148,4 +310,6 @@ let rang = generate_random_graph 9 50 ;; (*improved_pretty_printing fulg 1200 800 25 ;;*) improved_pretty_printing rang 1200 800 45 ;; -close_graph () ;; \ No newline at end of file +close_graph () ;; + +(* compilation command : ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics graphs.ml *) \ No newline at end of file