with Standard_Integer_Vectors; use Standard_Integer_Vectors; with Standard_Integer_VecVecs; use Standard_Integer_VecVecs; package body Common_Faces_of_Polytope is function Have_Common_Point ( l : List; v : VecVec ) return boolean is -- DESCRIPTION : -- Returns true if at least one point in v belongs to the list l. begin for i in v'range loop if Is_In(l,v(i).all) then return true; end if; end loop; return false; end Have_Common_Point; function Is_Neighbor1 ( l : List; fc : Face ) return boolean is begin return Have_Common_Point(l,fc.all); end Is_Neighbor1; function Is_Neighbor ( l : List; fc : Face ) return boolean is cntnotin : natural := 0; -- counts the points in the face fc that are not in the list l begin for i in fc'range loop if not Is_In(l,fc(i).all) then cntnotin := cntnotin + 1; if cntnotin > 1 then return false; end if; end if; end loop; return true; end Is_Neighbor; function Neighboring_Faces ( mic : Mixed_Cell; fs : Faces; i : natural ) return Faces is tmp : Faces := fs; res,res_last : Faces; begin while not Is_Null(tmp) loop declare fc : Face := Head_Of(tmp); begin if Is_Neighbor(mic.pts(i),fc) then Append(res,res_last,fc); end if; tmp := Tail_Of(tmp); end; end loop; return res; end Neighboring_Faces; function Neighboring_Faces ( mic : Mixed_Cell; afs : Array_of_Faces ) return Array_of_Faces is res : Array_of_Faces(afs'range); begin for i in res'range loop res(i) := Neighboring_Faces(mic,afs(i),i); end loop; return res; end Neighboring_Faces; end Common_Faces_of_Polytope;