[BACK]Return to face_cardinalities.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Supports

File: [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Supports / face_cardinalities.adb (download)

Revision 1.1, Sun Oct 29 17:45:27 2000 UTC (23 years, 8 months ago) by maekawa
Branch point for: MAIN

Initial revision

with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
with Integer_Face_Enumerators;
with Floating_Face_Enumerators;

package body Face_Cardinalities is

  function fvector ( pts : in Standard_Integer_VecVecs.VecVec )
                   return Vector is

  -- ALGORITHM : plain enumeration of vertices, edges, k-faces...

    use Integer_Face_Enumerators;

    n : constant natural := pts(pts'first).all'length;
    f : Vector(-1..n);
 
    procedure Count_Vertex ( i : in integer; cont : out boolean ) is
    begin
      f(0) := f(0) + 1;
      cont := true;
    end Count_Vertex;
    procedure Count_Vertices is new Enumerate_Vertices(Count_Vertex);

    procedure Count_Edge ( i,j : in integer; cont : out boolean ) is
    begin
      f(1) := f(1) + 1;
      cont := true;
    end Count_Edge;
    procedure Count_Edges is new Enumerate_Edges(Count_Edge);

    procedure Count_Face ( face : in Vector; cont : out boolean ) is
    begin
      f(face'length-1) := f(face'length-1) + 1;
      cont := true;
    end Count_Face;
    procedure Count_Faces is new Enumerate_Faces(Count_Face);

  begin
    f(-1) := 1;
    f(0..n) := (0..n => 0);
    Count_Vertices(pts);
    Count_Edges(pts);
    for i in 2..(n-1) loop
      Count_Faces(i,pts);
      exit when (f(i) = 0);
    end loop;
    if f(n-1) > 1
     then f(n) := 1;
    end if;
    return f;
  end fvector;

  function fvector ( pts : in Standard_Floating_VecVecs.VecVec )
                   return Vector is

  -- ALGORITHM : plain enumeration of vertices, edges, k-faces...

    use Floating_Face_Enumerators;

    n : constant natural := pts(pts'first).all'length;
    f : Vector(-1..n);
    tol : constant double_float := 10.0**(-8); --10.0**(-12);
 
    procedure Count_Vertex ( i : in integer; cont : out boolean ) is
    begin
      f(0) := f(0) + 1;
      cont := true;
    end Count_Vertex;
    procedure Count_Vertices is new Enumerate_Vertices(Count_Vertex);

    procedure Count_Edge ( i,j : in integer; cont : out boolean ) is
    begin
      f(1) := f(1) + 1;
      cont := true;
    end Count_Edge;
    procedure Count_Edges is new Enumerate_Edges(Count_Edge);

    procedure Count_Face ( face : in Vector; cont : out boolean ) is
    begin
      f(face'length-1) := f(face'length-1) + 1;
      cont := true;
    end Count_Face;
    procedure Count_Faces is new Enumerate_Faces(Count_Face);

  begin
    f(-1) := 1;
    f(0..n) := (0..n => 0);
    Count_Vertices(pts,tol);
    Count_Edges(pts,tol);
    for i in 2..(n-1) loop
      Count_Faces(i,pts,tol);
      exit when (f(i) = 0);
    end loop;
    if f(n-1) > 1
     then f(n) := 1;
    end if;
    return f;
  end fvector;

end Face_Cardinalities;