with Generic_Lists;
with Standard_Floating_Numbers; use Standard_Floating_Numbers;
with Standard_Floating_Vectors; use Standard_Floating_Vectors;
with Lists_of_Floating_Vectors; use Lists_of_Floating_Vectors;
with Arrays_of_Floating_Vector_Lists; use Arrays_of_Floating_Vector_Lists;
package Floating_Mixed_Subdivisions is
-- DESCRIPTION :
-- This package enables working with regular mixed subdivisions.
-- DATA STRUCTURES :
type Mixed_Subdivision; -- list of mixed cells
type Link_to_Mixed_Subdivision is access Mixed_Subdivision;
type Mixed_Cell is record
nor : Link_to_Vector; -- inner normal to the facet
pts : Link_to_Array_of_Lists; -- points that span the cell
sub : Link_to_Mixed_Subdivision; -- subdivision of the cell
end record;
package Lists_of_Mixed_Cells is new Generic_Lists(Mixed_Cell);
type Mixed_Subdivision is new Lists_of_Mixed_Cells.List;
-- CREATORS :
function Create ( pts : Array_of_Lists; nor : Vector; tol : double_float )
return Mixed_Cell;
function Create ( pts : Array_of_Lists; nors : List; tol : double_float )
return Mixed_Subdivision;
-- DESCRIPTION :
-- Creates the mixed cell(s) of those points whose inner product
-- with the given normal(s) is minimal.
-- The parameter tol is the tolerance on the precision.
function Create ( pts : Array_of_Lists; mixsub : Mixed_Subdivision;
tol : double_float ) return Mixed_Subdivision;
-- DESCRIPTION :
-- Takes the normals of the cells in the given mixed subdivision
-- and creates the mixed cells by selecting the points whose inner
-- product with the normals are minimal.
procedure Update ( pts : in Array_of_Lists; nor : in Vector;
mixsub,mixsub_last : in out Mixed_Subdivision );
-- DESCRIPTION :
-- Given a tuple of points and a normal, the mixed subdivision will
-- be updated: either an existing cell will get additional points,
-- if the normal already occurs in the subdivision, or otherwise,
-- a new cell will be created and appended to the mixed subdivision.
-- CONSTRUCTORS :
procedure Copy ( mic1 : in Mixed_Cell; mic2 : in out Mixed_Cell );
procedure Copy ( mixsub1 : in Mixed_Subdivision;
mixsub2 : in out Mixed_Subdivision );
-- DESCRIPTION :
-- Makes a deep copy of the cells and the subdivisions.
procedure Append_Diff ( first,last : in out Mixed_Subdivision;
mic : in Mixed_Cell );
-- DESCRIPTION :
-- Appends a mixed cell to the list of cells first, where
-- last points to the last element of the list first.
-- The suffix _Diff means that only when the cell does not already
-- belong to the list first, it will be appended.
procedure Concat_Diff ( first,last : in out Mixed_Subdivision;
mixsub : in Mixed_Subdivision );
-- DESCRIPTION :
-- Concatenates all cells in mixsub to the list of cells first,
-- last is a pointer to the last cell in first.
-- The suffix _Diff means that only when those cells that do not already
-- belong to the list first will be appended.
procedure Construct ( mixsub : in Mixed_Subdivision;
first : in out Mixed_Subdivision );
procedure Construct_Diff ( mixsub : in Mixed_Subdivision;
first : in out Mixed_Subdivision );
-- DESCRIPTION :
-- Constructs all cells in the mixed subdivision to the front of
-- the list first.
-- The suffix _Diff means that only when those cells that do not already
-- belong to the list first will be constructed to first.
-- SELECTORS :
function Equal ( mic1,mic2 : Mixed_Cell ) return boolean;
function Equal ( mixsub1,mixsub2 : Mixed_Subdivision ) return boolean;
function Equal ( mixsub1,mixsub2 : Link_to_Mixed_Subdivision )
return boolean;
-- DESCRIPTION :
-- Returns true when two mixed cells and mixed subdivisions are equal.
function Is_In ( mixsub : Mixed_Subdivision; normal : Vector ) return boolean;
function Is_In ( mixsub : Mixed_Subdivision; mic : Mixed_Cell )
return boolean;
-- DESCRIPTION :
-- Returns true if normal or cell belongs to the mixed subdivision,
-- otherwise false is returned. When the whole mixed cell is given,
-- then not only the normal, but also the points will be checked.
-- DESTRUCTORS :
procedure Deep_Clear ( mic : in out Mixed_Cell );
procedure Deep_Clear ( mixsub : in out Mixed_Subdivision );
procedure Deep_Clear ( mixsub : in out Link_to_Mixed_Subdivision );
procedure Shallow_Clear ( mic : in out Mixed_Cell );
procedure Shallow_Clear ( mixsub : in out Mixed_Subdivision );
procedure Shallow_Clear ( mixsub : in out Link_to_Mixed_Subdivision );
-- DESCRIPTION :
-- The memory space allocated will be freed.
-- A shallow clear only destroys the list structures,
-- while with a deep clear, also the contents of the lists are freed.
end Floating_Mixed_Subdivisions;