let add_in_zone (abs : float) (ord : float) (y : float list) : unit =
let min_l l = List.fold_left min (car l) (cdr l) in
let max_l l = List.fold_left max (car l) (cdr l) in
let zone_length = (max_l y) -. (min_l y) in
let dist = zone_length -. (min zone_length ( ( (float_of_int (number_of_common_line_between_all_zones abs ord)) -. 0.) *. !yDelta )) in
let rec aux l_infos_zones res =
match l_infos_zones with [] -> List.rev res
|(((absX,ordY),points_list)::ls) ->
if(ordY <= ord)
then aux ls (((absX,(ordY -. dist)),(List.map (fun p -> p -. dist) points_list))::res)
else aux ls (((absX,ordY),points_list)::res)
in
let lock = ref true in
List.iter
(fun ((role_x,tag_pos),zone) ->
if (role_x <> abs && tag_pos=ord && ((max_l zone) -. (min_l zone)) >= zone_length)
then lock:=false)
(!infos_zones);
if(!lock) then (
infos_zones:= aux (!infos_zones) []
);
let ord_zone = if(!lock) then (ord -. dist) else ord in
if not(List.mem (abs,ord_zone) (List.map (fun ((x,z),_) -> (x,z) ) (!infos_zones)))
then infos_zones := ((abs,ord_zone),y)::(!infos_zones)
else (
let y2 = List.assoc (abs,ord_zone) (!infos_zones) in
let y3 = y2@y in
infos_zones := ((abs,ord_zone),[(min_l y3) ; (max_l y3)])::(remove ((abs,ord_zone),y2) (!infos_zones))
)