From b55453b4cfb72f2b5929bbda8483f46272aed612 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 9 Jun 2024 15:00:53 +0200 Subject: [PATCH] Less clunky printing --- a.out | Bin 274473 -> 277680 bytes trees.cmi | Bin 6472 -> 8979 bytes trees.cmo | Bin 15361 -> 19024 bytes trees.ml | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 135 insertions(+), 3 deletions(-) diff --git a/a.out b/a.out index 73eb009549f6d4d2ec3a144381f2062ea7bb66bc..fbb0ce215da9d79f864684277334be44489cc3a5 100755 GIT binary patch delta 2526 zcmcJQeP~r>9LMi-o^$7!-K*#BEU#1cm>WV)vipZLz_>p_W69z0k$%b3G&Cjlkg3V zVdGm4azO-`z}p)@-;!DVDlD;nWfoG-#C>%bZv}UJ<=Ro5t6q~c=XHtOscgBiOIvPr zmMvE=XZj;oXlb3z$JqS9+s_PU(_NKQ__VfT&a232s1_t8^OxAVYd8lp|~R8n%1oY_{C2G%V>o zrLE+R5A+tLrb%s=esdAyK+mr0(Ev2V33pN`zOjB%I7WLWOXAMA7$##u0o3KPH}6OL(C1E?PxbBnE*0E0CiPHwr%NI49iv;-V2Z5zQiqrG)|3OjI1#|etq1q#ef+0Ta>+ zm`L{dC{P`vX3Fql!*NgKo6`9eUc@cE+L9YeMck{OTOk_4@H4LIn5GLd?}FuC-xG*) zb|Ii#MtB7t0$vd&nk0=}8rKhgO)f z@U&s6sC%y1d64S)w$Qpq!6!JD;r6U?R@oR;14g49+-)aM%?31>dl+LH%XvP!cR1$G z3WWW9pls>dsB?3eZ*K4cs?qO5Kn>~nR6EII-MTYRhA!wO(s)5P%8owtvio$il=h?7 z+lRSJ>{a*c8fm!{qQY@@1KALy#TP){E%CAI9Q5Yqo;?kHc{SBzoqxSIvx%R9e@-3QouCeIYi+zX*e45<0;%eDkQCl zXK0XjhDuv_#ywZ)EZ%^fRPU{#>pMO{B2Rmgd2-~IJT$0_)By=~>99H|Jze}G9@Kd% zN8TCKWjS;(0{Hsyit{uBcqn;oP&-OW-_;d4Phg?|uZ(_?Zf_BF8O>R%l|69L3PallMMP|TIhvoQOv&Ama&87d;HhlY-5&LHU*-MqlrSr^_8OHZJ Qa7Es*YSn$a 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 diff --git a/trees.cmo b/trees.cmo index 4f2ce08c30f0d05e59d5e770f927a3bf1aa7f6c2..ee19288d2da60f12a8d96ed99cf6bfb2a388bdd6 100644 GIT binary patch delta 5558 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 delta 2623 zcmZ8i4Qx}_74~P}m&8fzII*!~n-CM*Ng%fC#E2w=f)S(*ZO{S@WmCJkZtT*O5NHxu zV5=NP#^0h6=Y^&dbTS&ts))9Cy9$hkhH7U^y|IsDJRKigyjF3#e_N4+WZ=I_p;LS=ZY_Q zN`5fEu;3#YB>ctZ)x9e#wR`8)->wX356`PNRz9npoL4LB$Jgk|Un8S5nqBu77I^)? z+>4Zp-GwCFN)ZXi>qs8VtM?naP^88i*BcB3xJYtHbTn&?I@36}b`7mcN%%99u-(WD z`UXynUDap|c8dRorr%66ev+rrRBOC#-SK!&D*_X0`>KB@RDV0|ZKN~a)6@HMvBqBWHo8v0lQmLd^1u-dEnHofR z8h8nH#D3HLUj19hJvq)&?T25%~7Bep%H}6 zrp2+WeUVeOFzZ)P+8&+e1ZuGpp+6!tofdE4d;4Q%#F&wU(#hHdWsdbIa>DAJ)uoA? zyO~YRxySH%sv5{c|8q-9O5nvR5B?(h2c8mpTIzWP*Qvj!vof{ zFnSW~_yWci415XW2G;X1?q>ZpjQ#At591)Ozk~4bQ8XoTz(h5PRsqwHG`uifkw!I4lQO0f zCLTmV0H%KsLZ?|wjj8mj6klNd7K%Ai454_2^=l|u&3X(a=ZHA$%l?WjiH@FLlw4xx zyC}IWvpx;8AV9%Jn5ki^vl(WdZrHQ6tD_I*Rtf$X<~|v=4dx>fiNJi8GhK&;=MxpM z_;`H-mJDSFEE!4%EE!7TRal6Vr2oV+A(Q+JmRXs04=fKP@){PoIL+U&XpTd}SoAfo zXJK6|1CGMFK~fIG+9r|Xuu`Fj1Wv$uNrtGfUYE#8SgB5e#uTuv;NYLa#=E2- zA2vEen)?s1QJaMP9=10n@(yfQIQDtirX+A4HtLc>-bZPnL@uK=D3J=-Glm!TFq0Cn zH%m_q?48mG5R|E~6!tTcegk&e2ue5!d#1z`>@;su9E8IpLvF#*AVa3%poG-uT{toc zH^MO}T`h2&V$v8Kl$X+Nf#bR~w!$$Zjb=DC^#2om9!}n21^uT0+gL)ZA95k z+W({|Mj7p3l5UbE)I^eQk|lIhN#VefyHqiAV{Gq^^mOcxNBU6Cd-^E259OGuVdPnh^UjHCxKEK! zRKcCeJqk}y-P%;;^n}^J37%&5x4;vVIj+DnrH(eaot_!??}BHR{ax_pN&g*qcdLJE zs&RVz**^;J5%#|U?-};%a!_fZ9^8pa5Bo2pQXa%5RB|0fSB=Uv6Rx64Ce#H`)kl%b z<&^PP_e48U#bYbllc**R8Ly+7nkVBlmbFP^1j}fv2|0k}G0uy6_@=XOS_8dl(aaOA z=-PmTsE?q2M_SQs%`W!PBjvj%J8FgR!6WaQqI&@tK>dEy4-zMuT_lO)FO;0;;kVHH zyF8)j4gkl{kc);|iv4AFQO{4XpN@b=*2B+dpy&$WKP!!c@be}px;NpUlEz8+XH%)+ zVMX^l1k!Xg^41#)Zv1Fs`1H{`U;OjAul8?OKl>(?Qgq`(!S~jV?pyYg52Jave%(KI mPyd_Es=N71wQ=LUa^1%iF_%)%ol>-Kk)EP;7um () + | h::t -> begin + let is_f = Hashtbl.find_opt hash (h.self.x) in + if is_f = None then begin + Hashtbl.add hash (h.self.x) 1; + aux t + end + else + raise (CollisionDetected depth) + end + in + aux l;; + +let is_collision (mat : node list array) = + try + for i = 0 to (Array.length mat -1) do + is_collision_at_layer mat.(i) i + done; + None + with + | CollisionDetected x -> Some x ;; + +let encode_tree_into_mat tr current_increment = + let d = depth_of_tree tr in + let clist = Array.make d [] in + for i = 0 to d-1 do + clist.(i) <- [] + done; + + let rec fill t d dad where = match t with + | Empty -> () + | Leaf x -> begin + let self_x = ref dad.x in + if where = Left then + self_x := dad.x - current_increment.(d) + else if where = Right then + self_x := dad.x + current_increment.(d); + + let self = {x = !self_x ; y = -d} in + clist.(d) <- (clist.(d))@[{parent = dad ; self = self; tag = x}] + end + | Node (x, left, right) -> begin + let self_x = ref dad.x in + if where = Left then + self_x := dad.x - current_increment.(d) + else if where = Right then + self_x := dad.x + current_increment.(d); + + let self = {x = !self_x ; y = -d} in + fill left (d+1) self Left; + + clist.(d) <- (clist.(d))@[{parent = dad ; self = self; tag = x}]; + + fill right (d+1) self Right + end + in + fill tr 0 {x = 0; y = 0} Root; + match is_collision clist with + | Some x -> raise (CollisionDetected x) + | None -> clist ;; + +let decode_pt (p : pt) r width height = + (width/2 + p.x * r, height - r + (2*r)*p.y) ;; + +let rec print_edges (l : node list) r width height = match l with + | [] -> () + | nod::t -> begin + let (xd, yd) = decode_pt nod.self r width height in + let (xp, yp) = decode_pt nod.parent r width height in + + set_color (rgb 128 128 128); + set_line_width (max 1 (r/3)); + draw_poly_line [|(xd, yd); (xp, yp)|]; + + print_edges t r width height; + end ;; + +let rec print_vertexes (l : node list) r width height = match l with + | [] -> () + | nod::t -> begin + let (xd, yd) = decode_pt nod.self r width height in + + print_vertexes t r width height; + + set_color black; + set_line_width 5; + draw_circle xd yd r; + + set_color (rgb 32 255 32); + fill_circle xd yd r; + + set_color black; + set_line_width (max 1 (r/10)); + draw_integer xd yd nod.tag r; + end ;; + +let print_encoded (a : node list array) r width height = + for i = 0 to (Array.length a -1) do + print_edges a.(i) r width height; + done; + for i = 0 to (Array.length a -1) do + print_vertexes a.(i) r width height; + done ;; + +let rec yet_another_printing tr r width height current_increment = + try + print_encoded (encode_tree_into_mat tr current_increment) r width height; + () + with + | CollisionDetected ly -> begin + current_increment.(ly-1) <- current_increment.(ly-1) * 2; + yet_another_printing tr r width height current_increment + end ;; + +let finalized_printing tr r width height = + yet_another_printing tr r width height (Array.make (depth_of_tree tr) 2) ;; + +(* ABR things *) + let rec insert_abr tr e = match tr with | Empty -> Node (e, Empty, Empty) | Leaf t when e < t -> Node (t, (Node (e, Empty, Empty)), Empty) @@ -366,11 +497,12 @@ let successive_insert () = cur_tree := insert_abr !cur_tree elt; (*ignore (pretty_tree_printing_new_version !cur_tree 40 100 1200 1000 true)*) - ignore (even_more_pretty_printing !cur_tree 20 100 false); + (*ignore (even_more_pretty_printing !cur_tree 20 100 false);*) + finalized_printing !cur_tree 30 1400 1000; done; () with - | Stdlib.Scanf.Scan_failure _ -> ignore (even_more_pretty_printing !cur_tree 20 100 false) ;close_graph () ;; + | Stdlib.Scanf.Scan_failure _ -> finalized_printing !cur_tree 30 1400 1000;close_graph () ;; (* --------------------------------------| TESTS |-------------------------------------- *) Random.self_init () ;;