From 8ed1b5a320661893ad6d571ff2360110adb20dc1 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Fri, 31 May 2024 23:13:20 +0200 Subject: [PATCH] Added graph display and separated files --- a.out | Bin 281326 -> 279496 bytes graphs.cmi | Bin 0 -> 1173 bytes graphs.cmo | Bin 0 -> 6443 bytes graphs.ml | 106 +++++++++++++++++++ pretty_printing.cmi | Bin 7771 -> 3224 bytes pretty_printing.cmo | Bin 26010 -> 16047 bytes pretty_printing.ml | 251 +------------------------------------------- trees.cmi | Bin 0 -> 4660 bytes trees.cmo | Bin 0 -> 10252 bytes trees.ml | 250 +++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 357 insertions(+), 250 deletions(-) create mode 100644 graphs.cmi create mode 100644 graphs.cmo create mode 100644 graphs.ml create mode 100644 trees.cmi create mode 100644 trees.cmo create mode 100644 trees.ml diff --git a/a.out b/a.out index a628ac9496000902870a531becdc966f1c742e74..82db9a0b855cfade6d51c11e4a74d02789596d4a 100755 GIT binary patch delta 14116 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 Ynj?*Alxn19j?HS(u3ftUDJ@g}3&96;{{R30 delta 20191 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 a8!&nR+UxOcpxyxFp6s4IdydQMob{hMKPRLB diff --git a/graphs.cmi b/graphs.cmi new file mode 100644 index 0000000000000000000000000000000000000000..a66da937b95c4977ca47ef201261c396a4d5bb3d GIT binary patch literal 1173 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 GasCD9a}+NC literal 0 HcmV?d00001 diff --git a/graphs.ml b/graphs.ml new file mode 100644 index 0000000..b2e07f2 --- /dev/null +++ b/graphs.ml @@ -0,0 +1,106 @@ +open Graphics ;; + +let pi = 3.14159265358979343 ;; + +let rec ln10 n = match n with + | k when k < 0 -> failwith "Are you sure about that ?" + | k when k < 10 -> 0 + | k -> 1 + ln10 (k/10) ;; + +let delta i j = + if i = j then 1 else 0 ;; + +let draw_integer x0 y n0 r = + (* 7-seg display *) + let n = ref n0 in + let size = ln10 n0 in + let len = r/3 in + let offset = size*(len/2) in + for i = 0 to size do + 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 + draw_poly_line [|(x-len/2, y+len); (x-len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 7; 8; 9|] then + draw_poly_line [|(x-len/2, y+len); (x+len/2, y+len)|]; + + if Array.mem (!n mod 10) [|0; 1; 2; 3; 4; 7; 8; 9|] then + draw_poly_line [|(x+len/2, y+len); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|2; 3; 4; 5; 6; 8; 9|] then + draw_poly_line [|(x-len/2, y); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 1; 3; 4; 5; 6; 7; 8; 9|] then + draw_poly_line [|(x+len/2, y-len); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 8; 9|] then + draw_poly_line [|(x-len/2, y-len); (x+len/2, y-len)|]; + + if Array.mem (!n mod 10) [|0; 2; 6; 8|] then + draw_poly_line [|(x-len/2, y-len); (x-len/2, y)|]; + + n := !n/10; + done ;; + +let identity n = n ;; + +let improved_pretty_printing g wd ht r = + let n = Array.length g in + let coords = Array.make n (0, 0) in + + let colors = Array.make n (rgb 0 0 0) in + for i = 0 to n-1 do + colors.(i) <- rgb ((255 * i) / n) ((255*(i+n/3)) / n) ((255*(2*i+n/3)) / n) + done; + + for k = 0 to n-1 do + let theta = 2. *. pi *. (float_of_int k) /. (float_of_int (n)) +. pi /. (float_of_int (n)) in + let i = ref (int_of_float ((float_of_int wd) /. 2.) + int_of_float ((float_of_int wd) /. 2.2 *. cos theta)) in + let j = ref (int_of_float ((float_of_int ht) /. 2.) + int_of_float ((float_of_int ht) /. 2.2 *. sin theta)) in + set_line_width 8 ; + set_color colors.(k) ; + draw_circle !i !j r; + coords.(k) <- (!i, !j) + done ; + + for k = 0 to n-1 do + set_color colors.(k) ; + for l = 0 to (Array.length g.(k))-1 do + draw_poly_line [|coords.(k); coords.(g.(k).(l))|]; + done + done; + + set_line_width 22 ; + for k = 0 to n-1 do + set_color colors.(k) ; + for l = 0 to (Array.length g.(k))-1 do + let slope = Float.atan2 (float_of_int (snd coords.(g.(k).(l)) - snd coords.(k))) (float_of_int (fst coords.(g.(k).(l)) - fst coords.(k))) in + + let nexi = int_of_float (float_of_int (fst coords.(k)) +. (float_of_int r) *. 1.5 *. cos slope) in + let nexj = int_of_float (float_of_int (snd coords.(k)) +. (float_of_int r) *. 1.5 *. sin slope) in + draw_poly_line [|coords.(k); (nexi, nexj)|] + done + done; + + for k = 0 to n-1 do + set_line_width 10 ; + set_color black ; + fill_circle (fst coords.(k)) (snd coords.(k)) r; + set_color colors.(k) ; + set_line_width 5 ; + draw_integer (fst coords.(k)) (snd coords.(k)) k r + done; + + ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; + + +(* ----------------------- Tests --------------------------- *) + +open_graph " 1200x800" ;; +set_window_title "Graphs" ;; + +let gr = [|[|3; 5; 7|]; [|0|]; [|1; 7; 8|]; [|2; 6|]; [|0; 1; 3|]; [|6; 7|]; [|0; 1; 2|]; [|8|]; [|0; 7; 6|]; [||]; [||]; [|9|]|] ;; + +improved_pretty_printing gr 1200 800 50 ;; + +close_graph () ;; \ No newline at end of file diff --git a/pretty_printing.cmi b/pretty_printing.cmi index b63f5c6d15c545a0bd8e317662d2139d426faa67..d3dafd2c1ee8186da201245002f79f900fa7870f 100644 GIT binary patch literal 3224 zcmZu!d2mxj9Nyn!17!q92f+fBQ7A1?S_8#_I>NlRoOMPkh@uRpugPm0Nt2KSOSzF7 z5d%^cPSI|G+_S@h2?YA#)x2amLt4&f; zQV(mQbxc9gCPJQhkr1UPArafyGv9bM-KPfv`8Kc5=?*yE*+#L^Qea!I767=lKeR;+ ztqK-4*L*%Lzq`ROt;xs2W-K9D4XTQz{47zSa(Fd7q6(9dJT`iu+ZpJJ#!=xc@~K)J zYU_QHLPD-9wO8K|RZ@F7RCO+GuBt|<(W<8&80d4ScswqE+YyAkOc)1!kh_~26nvsH znX3!-7_F+w#i1CR+vC=4s!A%UlFX_lbxBd#BAa@h0Ok9|(z0A0EzlV=$1qYfx-TfB zKp7jN%}q3(bLrldCpXhF{Q!5u+R%=eI+jwov~j#jVn0ykfl?Hr?M$?oS9!l1uM*9w zWC7f*lK5#J<7rJ3IDAb4u(Y_{Xz}pUglebND__REm%gH3p z^yz-xoulOf+&7m*hl$r^q`5uz9L<-4&88sy0%6dkIfbRr=SAL=uNj$&vC|NKX}+a& zI+~`3O*7F{5H=ZT`ihxo9X>>aolDU9H6u}k({H3IGbETP!7K^BmEb!GW=k+f0)vZM z=mFXYXp<0~Z=yC_)a~h9)L4hp?{#VU01v`KmT^6H{;!U6k>EUpg<>`ID9<~=^XNfz z&PTWaVG#@6kJE*c?ji{mbKZM^jDdQwP%kb-_e$KBbH8Ed+^u2mHosT5JF}d2fQR8l zT<2tN@u3yAsV4XLXkBX3uVBFzAUq`&ohuM7L%5u8Vl5VV4{gPg`br6YkYE*GOgWGO zsDBUYKMK)1Vceh&TZ{!7I{9j1^g#jL?ErWbUc+E4zFKg!z)PH-!G}5MT!ZjOgloeo zt$6e@HUupYgYKUYu0vQNl2~K{+SUsj`#e*g*B?w8dMS@ZZ zewJV>)5!vDfD}RGX^1?_CT->9qEM>0mn+r6>Co8$5@0WFh0uy#H4g@|je;yzCW>_g zQUZ z>d>Nf(fiVb*dIr<9XuroXR zZ8RU0eGZ8}AkM$WZCzYbl5+V+=PVD_=r-tszw`FN=d%i8(r+IU#E(4%| zl)q5Ozf{Qj)F=5cGB|?psHwX!_rrTEdc z@*(&{&661NtK|Nd1b<6#NrKA~ToD_33CL+^vILqeXB&E1PImJRRh}i{JZ@=jqa(`? ziW1&Cr7kC}Jjdxckib=h*AV_AHpHSdlKKxt-wj>|s(k{lOMW*o=vKG@|HfIAc#%@A z>uroIM|dZk)LtaLE|N5K-$hvM>wcd%u%hdMWb;shM-o&>@R$p!!~=AIxIGYefK3wQ zQr{~+;d^%DAk zpf%0W0Y)CS<&Ld$E^TG4{*i_eUsb}cxwC>+%kIh96=~56X5FnMx?Sk zSJ0|mh`m@cX!G>+(&_J|<~2Q8twb`v)d#J8n)JRrH*M+KLyPM!s$I6ZgJHy&C4$!Y zh?uNRBT7rAx_yaBfvINvb@lkzKMEh(-}bPOgfamY_E`911XcB49%9I3 literal 7771 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 diff --git a/pretty_printing.cmo b/pretty_printing.cmo index 23be77a4f1ae13dac677d4df422b941bde2e2467..5c3d666183bc3a11efd972b0f3a7e048df55e3ef 100644 GIT binary patch delta 4851 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 1 - | 1 -> x - | k when k mod 2 = 0 -> let res = pw x (n/2) in res*res - | k -> let res = pw x (n/2) in res*res*x ;; - -let rec depth_of_tree t = match t with - | Leaf _ -> 1 - | Node (_, g, d) -> 1 + max (depth_of_tree g) (depth_of_tree d) - | Empty -> 0;; - -let fill_data te ystep sx sy r = - let depth = depth_of_tree te in - let res = Array.make (depth+1) [] in - let rec aux t cur_x cur_d spacing pcx pcy = match t with - | Node (x, g, d) -> begin - aux g (cur_x - spacing) (cur_d+1) (spacing/2) cur_x (sy - r - 20 - ystep * cur_d); - res.(cur_d) <- (((x, (pcx, pcy)), (cur_x, sy - r - 20 - ystep * cur_d)))::(res.(cur_d)); - aux d (cur_x + spacing) (cur_d+1) (spacing/2) cur_x (sy - r - 20 - ystep * cur_d); - end - | Leaf x -> begin - res.(cur_d) <- (((x, (pcx, pcy)), (cur_x, sy - r - ystep * cur_d)))::(res.(cur_d)); - end - | Empty -> () - in aux te (sx/2) 0 (r/2 + r * ((pw 2 (depth-1)) - 1)) (-1) (-1); res ;; - -let rec ln10 n = match n with - | k when k < 0 -> failwith "Are you sure about that ?" - | k when k < 10 -> 0 - | k -> 1 + ln10 (k/10) ;; - -let delta i j = - if i = j then 1 else 0 ;; - -let draw_integer x0 y n0 r = - (* 7-seg display *) - let n = ref n0 in - let size = ln10 n0 in - let len = r/3 in - let offset = size*(len/2) in - for i = 0 to size do - 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 - draw_poly_line [|(x-len/2, y+len); (x-len/2, y)|]; - - if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 7; 8; 9|] then - draw_poly_line [|(x-len/2, y+len); (x+len/2, y+len)|]; - - if Array.mem (!n mod 10) [|0; 1; 2; 3; 4; 7; 8; 9|] then - draw_poly_line [|(x+len/2, y+len); (x+len/2, y)|]; - - if Array.mem (!n mod 10) [|2; 3; 4; 5; 6; 8; 9|] then - draw_poly_line [|(x-len/2, y); (x+len/2, y)|]; - - if Array.mem (!n mod 10) [|0; 1; 3; 4; 5; 6; 7; 8; 9|] then - draw_poly_line [|(x+len/2, y-len); (x+len/2, y)|]; - - if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 8; 9|] then - draw_poly_line [|(x-len/2, y-len); (x+len/2, y-len)|]; - - if Array.mem (!n mod 10) [|0; 2; 6; 8|] then - draw_poly_line [|(x-len/2, y-len); (x-len/2, y)|]; - - n := !n/10; - done ;; - -let rec draw_list l d r = match l with - | [] -> () - | h::t -> begin - set_color (rgb 192 192 192); - fill_circle (fst (snd h)) (snd (snd h)) r; - set_color black; - draw_circle (fst (snd h)) (snd (snd h)) r; - moveto (fst (snd h)) (snd (snd h)); - set_color (rgb 32 192 32); - draw_integer (fst (snd h)) (snd (snd h)) (fst (fst h)) r; - draw_list t d r - end;; - -let connect l0 = - let rec aux l = match l with - | [] -> () - | ((_, (xf, yf)), (x, y))::t -> - if xf >= 0 && yf >= 0 then begin - set_color (rgb 192 192 192); - draw_poly_line [|(xf, yf); (x, y)|]; - aux t - end - in aux l0 ;; - -let even_more_pretty_printing t r ystep skip = - - let sx = Graphics.size_x () in - let sy = Graphics.size_y () in - - let graphdata = fill_data t ystep sx sy (6*r/10) in - (* graphdata is a ((int * (int * int)) * (int * int)) list array *) - (* <==> ((value, (parent_x, parent_y)), (this_x, this_y)) *) - if skip = false then begin - set_color (rgb 192 192 192); - set_line_width 15 ; - for dpth = 1 to (Array.length graphdata -1) do - connect graphdata.(dpth-1); - done; - - set_line_width 5 ; - for dpth = 0 to (Array.length graphdata -1) do - draw_list graphdata.(dpth) dpth r - done; - - let halt = ref false in - while !halt = false do - Unix.sleepf 0.1 ; - Unix.sleepf 2.0 ; - halt := true; - done; - end; - graphdata ;; - - -let generate_full_tree d = - let rec aux n = match n with - | 0 -> Leaf (Random.int 1000) - | k -> begin - Node (Random.int 1000, aux (n-1), aux (n-1)) - end - in aux d ;; - -let generate_some_tree maxd nodechance leafchance = - let rec aux n = match n with - | 0 -> if (Random.int 101 < leafchance) then Leaf (Random.int 100) else Empty - | k -> begin - match Random.int 101 with - | k when k <= nodechance -> Node (Random.int 1000, aux (n-1), aux (n-1)) - | k -> if (Random.int 101 < leafchance) then Leaf (Random.int 1000) else Empty - end - in aux maxd ;; - -let rec nth l n = match l with - | [] -> failwith "Out of range" - | h::t when n = 0 -> h - | h::t -> nth t (n-1) ;; - -let even_more_fancy_dfs_prefixe t graphdata r tts rfound gfound bfound rmark gmark bmark = - let d = depth_of_tree t in - let count_per_depth = Array.make d 0 in - let rec aux tr dpth = - match tr with - | Empty -> () - | Leaf _ -> begin - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - count_per_depth.(dpth) - 1) in - count_per_depth.(dpth) <- count_per_depth.(dpth) + 1; - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - end - | Node (_, g, d) -> begin - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - count_per_depth.(dpth) - 1) in - count_per_depth.(dpth) <- count_per_depth.(dpth) + 1; - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - - aux g (dpth+1); - aux d (dpth+1); - end - in aux t 0 ;; - - -let even_more_fancy_dfs_infixe t graphdata r tts rfound gfound bfound rmark gmark bmark = - let rec aux tr dpth os = - match tr with - | Empty -> () - | Leaf _ -> begin - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - end - | Node (_, g, d) -> begin - aux g (dpth+1) (2*os); - - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - - aux d (dpth+1) (2*os + 1); - end - in aux t 0 0 ;; - - -let even_more_fancy_dfs_postfixe t graphdata r tts rfound gfound bfound rmark gmark bmark = - let rec aux tr dpth os = - match tr with - | Empty -> () - | Leaf _ -> begin - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - end - | Node (_, g, d) -> begin - aux g (dpth+1) (2*os); - aux d (dpth+1) (2*os + 1); - - let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in - set_color (rgb rfound gfound bfound); - draw_circle (fst (snd data)) (snd (snd data)) r; - Unix.sleepf tts; - set_color (rgb rmark gmark bmark); - draw_circle (fst (snd data)) (snd (snd data)) r; - end - in aux t 0 0 ;; - -(* --------------------------------------| TESTS |-------------------------------------- *) -Random.self_init ;; - -open_graph " 1800x800" ;; -set_window_title "Trees" ;; - -let tt = generate_some_tree 4 100 75 ;; - -let gdata = even_more_pretty_printing tt 40 150 false ;; - -even_more_fancy_dfs_prefixe tt gdata 40 0.2 255 255 32 32 32 255 ;; - -close_graph () ;; - -(* compilation command : ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics pretty_printing.ml *) -print_int 0 ;; -print_char '\n' ;; \ No newline at end of file +(* compilation command : ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics trees.ml *) \ No newline at end of file diff --git a/trees.cmi b/trees.cmi new file mode 100644 index 0000000000000000000000000000000000000000..91da438ffa3422a179aa2231239f10e89f71c550 GIT binary patch literal 4660 zcmZu#33wFM9e;0m3#7yk#1HW+MIt!}2)Y5(gv(79LIcRL5IJI8hU{#zu-Of}!x6C{ zhqM$Z1C$D)@?tpTs9d5zF)UZO5roQ7DUV(lV_a4cFc7P4RRtk3CZw@_3avad^A|x4VKop3QVA15_n| zM(C8Z;7ZcO<1LPpM2|PdB}qA4GBDy-(MTp~L*rX@(vFf8x9$dq&oh!Vq@=x#d(N6Qj9t(o>-M+|!WW+)*dLTBeowA_1Q$WtH$r zGFUY&D?My}dh*m;+lXG4>_zTu$RLcEUS)f06);9yY2YEaM|BG>W@9P=cK+BwEh3S8n1}fud?M=D5!Nd>Q!R`CWM1pu8s9s5stQy zVxch>D&q0q9EY7g>@13t8i67#ekVp_jX^gO;1h=NJ~R4qbJke(589lTu=(Esbu6}g z1jRs-w{23D&)5q#!f(j~78+~YAICE%hroJB6yi&pqLdYa*uP<6%TUBZWfmIGGI!!% zq5e4GHcq(DaBG2o;WV<(n834dR}=|{)gqSrelz!VkURMXf|)21)X8XDI2zATwGlDP z^#lt|;#ZPH%5HyPENY?2wu{S|u~%*D*DTc(Bad7(0ykNPo4m{N=xgGYMji!Icph2m zL^bRyjYL&nSya`ua`uM}WiVWf@d1&U6L)7JvyxbD(3=*-4_-Ga?!;|v+;2n|?%SxT z2F314VmO&k_Nv&Bx(pHp>+_F??CKuGm^$asjGz-9Nqhd|C?zYsu0o&67 z{8n!MPQp2`{d)j&0n7t1-zex@RD=^x;Ka{aLFbwHrcqFejHgZKVl}Kr6;1U8Ca@=g zc;r+=DbuCTKk%aR#Qyi;hZaZ?JfP4*!+Rx0({Zz8+^ijQzY-Sww&KLwk#Sd){$r6+ z)%1T5{JW*;MWRV9C9_yCwnqPv$GD0YRkjx`kyrc)it`qLr2v*00q@0V4sP}pZgztO zybl(4jeyUxvjQ8zGphE7pyPW)h5-uwD`2#Wj9S8&`v*Xrb2Tm@|9wcbtg`f7rxK+PW-fFDj@bs0P@z3R!iL)a4BzQ=mWu3rUpV0Me8la zYe6gzRcIY>eWh+aaPnb|HW(afE>(XPj67|i4+YaqYBus&k*6lK39{J?U<-h)06qe+ z4Zz0$J^`>DzzzUAd5;~L7%jz*A^aF&i!4~Q;XQV|g#5h6-5%ECU|6*Hh}mLCC*I=w zX3zd26WS$GRQULhHd^U)B$%?ed5@B3DOAOEugJ?kg>ZKR*dsUhO1MwBDUi&5!Hkm3 z0l^HHOtoNMmdruHwuzeeChDK9)sdn&{+F=;UiTPR%2(TV<%Z;j?=8nPCQt~S0~|Z z!(c5&wK%B^Cuz*!53rcX4K`rs(D%5()MD|nb=Y#7~gZT>$^&ml1xna5`p7VLj~M0U*yi=wDLzZ=Onn))@VWla}Emb`opwBrM)H zQt6D*3b$MQ41ntqLj4iKzhr-}QS)~I-StkZt7n$F&-d(5*ZJ!OFZOIhX-a-LI9Ye) zRqtO^G3U~Ew+eoGt$6W`dz3ysRP%>|V|>1$>UiDN&!36kIO8jQGx1u#&5g!ALFqHF z?^VM7NU83czVUF{r4Z>pfxJGdSNkc2lxBcrprQpQs_aClyOQ+Co}8xJ5*E?)>0j0_ zCzN&s)d2Pupu1M**Cbb6KOen#;n5kDX#?sg?F53nu=adc-If3C$ma)pTQA-1 zLFu#L#uF(m3#qIq7Yn+cI(BJPVfThj1GT%mZKBi#nw(&<@rtaw8jkpWeWUHJqCrn2 z5AW3Rgkp;(o4-Wst`Se>->m4j;gi#AANe4mdUqzJX~K-|>eM(bP&IAu&V}JpGaw@hyCEg-}a(mC6pV9mMU6~5;Mg6 jx6NGBt|q;H*Ye7-7yX|dGzS3@HUJLxaq_ literal 0 HcmV?d00001 diff --git a/trees.cmo b/trees.cmo new file mode 100644 index 0000000000000000000000000000000000000000..2e95b0d39abb34678f5274a3197cd4d697a4b3d6 GIT binary patch literal 10252 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 literal 0 HcmV?d00001 diff --git a/trees.ml b/trees.ml new file mode 100644 index 0000000..93f3162 --- /dev/null +++ b/trees.ml @@ -0,0 +1,250 @@ +open Graphics ;; + +type 'a tree = Empty | Leaf of 'a | Node of 'a * 'a tree * 'a tree ;; + +(* +STRUCT : (digit, xcoord, ycoord) +*) + +let rec pw x n = match n with + | 0 -> 1 + | 1 -> x + | k when k mod 2 = 0 -> let res = pw x (n/2) in res*res + | k -> let res = pw x (n/2) in res*res*x ;; + +let rec depth_of_tree t = match t with + | Leaf _ -> 1 + | Node (_, g, d) -> 1 + max (depth_of_tree g) (depth_of_tree d) + | Empty -> 0;; + +let fill_data te ystep sx sy r = + let depth = depth_of_tree te in + let res = Array.make (depth+1) [] in + let rec aux t cur_x cur_d spacing pcx pcy = match t with + | Node (x, g, d) -> begin + aux g (cur_x - spacing) (cur_d+1) (spacing/2) cur_x (sy - r - 20 - ystep * cur_d); + res.(cur_d) <- (((x, (pcx, pcy)), (cur_x, sy - r - 20 - ystep * cur_d)))::(res.(cur_d)); + aux d (cur_x + spacing) (cur_d+1) (spacing/2) cur_x (sy - r - 20 - ystep * cur_d); + end + | Leaf x -> begin + res.(cur_d) <- (((x, (pcx, pcy)), (cur_x, sy - r - ystep * cur_d)))::(res.(cur_d)); + end + | Empty -> () + in aux te (sx/2) 0 (r/2 + r * ((pw 2 (depth-1)) - 1)) (-1) (-1); res ;; + +let rec ln10 n = match n with + | k when k < 0 -> failwith "Are you sure about that ?" + | k when k < 10 -> 0 + | k -> 1 + ln10 (k/10) ;; + +let delta i j = + if i = j then 1 else 0 ;; + +let draw_integer x0 y n0 r = + (* 7-seg display *) + let n = ref n0 in + let size = ln10 n0 in + let len = r/3 in + let offset = size*(len/2) in + for i = 0 to size do + 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 + draw_poly_line [|(x-len/2, y+len); (x-len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 7; 8; 9|] then + draw_poly_line [|(x-len/2, y+len); (x+len/2, y+len)|]; + + if Array.mem (!n mod 10) [|0; 1; 2; 3; 4; 7; 8; 9|] then + draw_poly_line [|(x+len/2, y+len); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|2; 3; 4; 5; 6; 8; 9|] then + draw_poly_line [|(x-len/2, y); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 1; 3; 4; 5; 6; 7; 8; 9|] then + draw_poly_line [|(x+len/2, y-len); (x+len/2, y)|]; + + if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 8; 9|] then + draw_poly_line [|(x-len/2, y-len); (x+len/2, y-len)|]; + + if Array.mem (!n mod 10) [|0; 2; 6; 8|] then + draw_poly_line [|(x-len/2, y-len); (x-len/2, y)|]; + + n := !n/10; + done ;; + +let rec draw_list l d r = match l with + | [] -> () + | h::t -> begin + set_color (rgb 192 192 192); + fill_circle (fst (snd h)) (snd (snd h)) r; + set_color black; + draw_circle (fst (snd h)) (snd (snd h)) r; + moveto (fst (snd h)) (snd (snd h)); + set_color (rgb 32 192 32); + draw_integer (fst (snd h)) (snd (snd h)) (fst (fst h)) r; + draw_list t d r + end;; + +let connect l0 = + let rec aux l = match l with + | [] -> () + | ((_, (xf, yf)), (x, y))::t -> + if xf >= 0 && yf >= 0 then begin + set_color (rgb 192 192 192); + draw_poly_line [|(xf, yf); (x, y)|]; + aux t + end + in aux l0 ;; + +let even_more_pretty_printing t r ystep skip = + + let sx = Graphics.size_x () in + let sy = Graphics.size_y () in + + let graphdata = fill_data t ystep sx sy (6*r/10) in + (* graphdata is a ((int * (int * int)) * (int * int)) list array *) + (* <==> ((value, (parent_x, parent_y)), (this_x, this_y)) *) + if skip = false then begin + set_color (rgb 192 192 192); + set_line_width 15 ; + for dpth = 1 to (Array.length graphdata -1) do + connect graphdata.(dpth-1); + done; + + set_line_width 5 ; + for dpth = 0 to (Array.length graphdata -1) do + draw_list graphdata.(dpth) dpth r + done; + + let halt = ref false in + while !halt = false do + Unix.sleepf 0.1 ; + Unix.sleepf 2.0 ; + halt := true; + done; + end; + graphdata ;; + + +let generate_full_tree d = + let rec aux n = match n with + | 0 -> Leaf (Random.int 1000) + | k -> begin + Node (Random.int 1000, aux (n-1), aux (n-1)) + end + in aux d ;; + +let generate_some_tree maxd nodechance leafchance = + let rec aux n = match n with + | 0 -> if (Random.int 101 < leafchance) then Leaf (Random.int 100) else Empty + | k -> begin + match Random.int 101 with + | k when k <= nodechance -> Node (Random.int 1000, aux (n-1), aux (n-1)) + | k -> if (Random.int 101 < leafchance) then Leaf (Random.int 1000) else Empty + end + in aux maxd ;; + +let rec nth l n = match l with + | [] -> failwith "Out of range" + | h::t when n = 0 -> h + | h::t -> nth t (n-1) ;; + +let even_more_fancy_dfs_prefixe t graphdata r tts rfound gfound bfound rmark gmark bmark = + let d = depth_of_tree t in + let count_per_depth = Array.make d 0 in + let rec aux tr dpth = + match tr with + | Empty -> () + | Leaf _ -> begin + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - count_per_depth.(dpth) - 1) in + count_per_depth.(dpth) <- count_per_depth.(dpth) + 1; + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + end + | Node (_, g, d) -> begin + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - count_per_depth.(dpth) - 1) in + count_per_depth.(dpth) <- count_per_depth.(dpth) + 1; + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + + aux g (dpth+1); + aux d (dpth+1); + end + in aux t 0 ;; + + +let even_more_fancy_dfs_infixe t graphdata r tts rfound gfound bfound rmark gmark bmark = + let rec aux tr dpth os = + match tr with + | Empty -> () + | Leaf _ -> begin + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + end + | Node (_, g, d) -> begin + aux g (dpth+1) (2*os); + + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + + aux d (dpth+1) (2*os + 1); + end + in aux t 0 0 ;; + + +let even_more_fancy_dfs_postfixe t graphdata r tts rfound gfound bfound rmark gmark bmark = + let rec aux tr dpth os = + match tr with + | Empty -> () + | Leaf _ -> begin + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + end + | Node (_, g, d) -> begin + aux g (dpth+1) (2*os); + aux d (dpth+1) (2*os + 1); + + let data = nth graphdata.(dpth) (List.length graphdata.(dpth) - os - 1) in + set_color (rgb rfound gfound bfound); + draw_circle (fst (snd data)) (snd (snd data)) r; + Unix.sleepf tts; + set_color (rgb rmark gmark bmark); + draw_circle (fst (snd data)) (snd (snd data)) r; + end + in aux t 0 0 ;; + +(* --------------------------------------| TESTS |-------------------------------------- *) +Random.self_init ;; + +open_graph " 1800x800" ;; +set_window_title "Trees" ;; + +let tt = generate_some_tree 4 100 75 ;; + +let gdata = even_more_pretty_printing tt 40 150 false ;; + +even_more_fancy_dfs_prefixe tt gdata 40 0.2 255 255 32 32 32 255 ;; + +close_graph () ;; + +(* compilation command : ocamlfind ocamlc -linkpkg -package unix -linkpkg -package graphics trees.ml *) +print_int 0 ;; +print_char '\n' ;; \ No newline at end of file