Weighted graphs can now be displayed

This commit is contained in:
Alexandre 2024-06-04 18:49:37 +02:00
parent 80dd15b8b0
commit fab702b4a5
4 changed files with 113 additions and 16 deletions

BIN
a.out

Binary file not shown.

Binary file not shown.

Binary file not shown.

129
graphs.ml
View File

@ -5,7 +5,7 @@ open Graphics ;;
- main function : 68 - 120 - main function : 68 - 120
- type 2 printing: 122 - 270 - type 2 printing: 122 - 270
- DFS : 275 - 530 (yes the function is that big) - DFS : 275 - 530 (yes the function is that big)
- BFS : 532 - 727
@ -31,7 +31,7 @@ let draw_integer x0 y n0 r =
let n = ref n0 in let n = ref n0 in
let size = ln10 n0 in let size = ln10 n0 in
let len = r/3 in let len = r/3 in
let offset = size*(len/2) in let offset = (size-1)*(len/2) in
for i = 0 to size do for i = 0 to size do
let x = x0 - (-(1 - delta size 0)*8 - offset + i * (len+8)) in let x = x0 - (-(1 - delta size 0)*8 - offset + i * (len+8)) in
if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then
@ -134,7 +134,12 @@ let generate_type2_graph w h freq inf sup =
let weighted_d100 i = let weighted_d100 i =
let res = Random.int 100 in let res = Random.int 100 in
if res <= freq then res else (-1) if res <= freq then
try
(inf + Random.int (sup-inf))
with
| Invalid_argument _ -> inf
else (-1)
in in
let gr = {width = w ; height = h ; g = Array.make w [||]} in let gr = {width = w ; height = h ; g = Array.make w [||]} in
@ -147,7 +152,7 @@ let generate_type2_graph w h freq inf sup =
gr ;; gr ;;
let another_type_of_graph_printing (gr : type2graph) r d = let another_type_of_graph_printing (gr : type2graph) r d 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
@ -214,41 +219,133 @@ let another_type_of_graph_printing (gr : type2graph) r d =
done done
done; done;
let roff = (6*r)/5 in
let roff2 = (7*r)/5 in
let rsize = (3*r)/4 in
let wcolor = rgb 32 255 32 in
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
set_color colors.(i).(j) ;
let node_xy = ((r + (2*r + d)*i), (r + (2*r + d)*j)) in 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 *) 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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy - roff) (snd node_xy - roff) (3*rsize/4) ;
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
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy - roff2) (snd node_xy) (3*rsize/4) ;
set_color wcolor;
set_line_width 3;
draw_integer (fst node_xy - roff2) (snd node_xy) gr.g.(i).(j).edges.(1) rsize;
end
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy - roff) (snd node_xy + roff) (3*rsize/4) ;
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
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy) (snd node_xy + roff2) (3*rsize/4) ;
set_color wcolor;
set_line_width 3;
draw_integer (fst node_xy) (snd node_xy + roff2) gr.g.(i).(j).edges.(3) rsize;
end
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy + roff) (snd node_xy + roff) (3*rsize/4) ;
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
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy + roff2) (snd node_xy) (3*rsize/4) ;
set_color wcolor;
set_line_width 3;
draw_integer (fst node_xy + roff2) (snd node_xy) gr.g.(i).(j).edges.(5) rsize;
end
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy + roff) (snd node_xy - roff) (3*rsize/4) ;
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
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|] ;
end
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|] ; if is_weighted then begin
set_color white;
fill_circle (fst node_xy) (snd node_xy - roff2) (3*rsize/4) ;
set_color wcolor;
set_line_width 3;
draw_integer (fst node_xy) (snd node_xy - roff2) gr.g.(i).(j).edges.(7) rsize;
end
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|] ;
end
end; end;
done done
@ -735,11 +832,11 @@ let another_type_of_bfs (gr : type2graph) r d =
open_graph " 1200x800" ;; open_graph " 1200x800" ;;
set_window_title "Graphs" ;; set_window_title "Graphs" ;;
let type2 = generate_type2_graph 8 6 40 1 1 ;; let type2 = generate_type2_graph 7 5 40 1 10 ;;
(*another_type_of_graph_printing type2 35 75 ;;*) another_type_of_graph_printing type2 35 100 true ;;
(*another_type_of_dfs type2 35 75 ;;*) (*another_type_of_dfs type2 35 75 ;;*)
another_type_of_bfs type2 35 75 ;; (*another_type_of_bfs type2 35 75 ;;*)
close_graph () ;; close_graph () ;;