Added type 2 graph display
This commit is contained in:
parent
648b62ea4b
commit
9778738d4d
BIN
graphs.cmi
BIN
graphs.cmi
Binary file not shown.
BIN
graphs.cmo
BIN
graphs.cmo
Binary file not shown.
172
graphs.ml
172
graphs.ml
|
@ -1,5 +1,7 @@
|
||||||
open Graphics ;;
|
open Graphics ;;
|
||||||
|
|
||||||
|
Random.self_init () ;;
|
||||||
|
|
||||||
let pi = 3.14159265358979343 ;;
|
let pi = 3.14159265358979343 ;;
|
||||||
|
|
||||||
let rec ln10 n = match n with
|
let rec ln10 n = match n with
|
||||||
|
@ -44,6 +46,11 @@ let draw_integer x0 y n0 r =
|
||||||
|
|
||||||
let identity n = n ;;
|
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 improved_pretty_printing g wd ht r =
|
||||||
let n = Array.length g in
|
let n = Array.length g in
|
||||||
let coords = Array.make n (0, 0) in
|
let coords = Array.make n (0, 0) in
|
||||||
|
@ -73,7 +80,7 @@ let improved_pretty_printing g wd ht r =
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
|
|
||||||
set_line_width 12 ;
|
set_line_width 8 ;
|
||||||
for k = 0 to n-1 do
|
for k = 0 to n-1 do
|
||||||
set_color colors.(k) ;
|
set_color colors.(k) ;
|
||||||
for l = 0 to (Array.length g.(k))-1 do
|
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) ;;
|
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 --------------------------- *)
|
(* ----------------------- Tests --------------------------- *)
|
||||||
|
|
||||||
Random.self_init ;;
|
open_graph " 1200x800" ;;
|
||||||
Random.self_init ;;
|
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" ;;
|
open_graph " 1200x800" ;;
|
||||||
set_window_title "Graphs" ;;
|
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 fulg 1200 800 25 ;;*)
|
||||||
improved_pretty_printing rang 1200 800 45 ;;
|
improved_pretty_printing rang 1200 800 45 ;;
|
||||||
|
|
||||||
close_graph () ;;
|
close_graph () ;;
|
||||||
|
|
||||||
|
(* compilation command : ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics graphs.ml *)
|
Loading…
Reference in New Issue