LCOV - code coverage report
Current view: top level - geom/facet - PST_Data.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 695 0.1 %
Date: 2020-06-30 00:58:45 Functions: 2 48 4.2 %
Branches: 2 1018 0.2 %

           Branch data     Line data    Source code
       1                 :            : #include "PST_Data.hpp"
       2                 :            : #include "GMem.hpp"
       3                 :            : #include "GfxDebug.hpp"
       4                 :            : #include "GeometryDefines.h"
       5                 :            : #include "CubitMessage.hpp"
       6                 :            : 
       7                 :            : #define PST_MAX_LIST_LEN 1000
       8                 :            : // Used only for debugging.  Has no effect
       9                 :            : // if compiled -DNDEBUG.
      10                 :            : 
      11                 :            : const double RESABS_SQR = GEOMETRY_RESABS * GEOMETRY_RESABS;
      12                 :            : 
      13                 :            : 
      14                 :            : /*************************************************************************
      15                 :            :  *                               PST_Point
      16                 :            :  ************************************************************************/
      17                 :            : 
      18                 :          0 : PST_Point::~PST_Point()
      19                 :            : {
      20         [ #  # ]:          0 :   while( edge_ )
      21 [ #  # ][ #  # ]:          0 :     delete edge_;
      22         [ #  # ]:          0 : }
      23                 :            : 
      24                 :          0 : PST_Edge* PST_Point::common( PST_Point* pt )
      25                 :            : {
      26         [ #  # ]:          0 :   if( edge_ )
      27                 :            :   {
      28                 :            : #ifndef NDEBUG
      29                 :          0 :     int debug = 0;
      30                 :            : #endif
      31                 :            :     
      32                 :          0 :     PST_Edge* e = edge_;
      33         [ #  # ]:          0 :     do
      34                 :            :     {
      35         [ #  # ]:          0 :       if( e->other(pt) == this )
      36                 :          0 :         return e;
      37                 :          0 :       e = next( e );  
      38                 :            :     
      39                 :            : #ifndef NDEBUG
      40         [ #  # ]:          0 :       assert( ++debug < PST_MAX_LIST_LEN );
      41                 :            : #endif
      42         [ #  # ]:          0 :     } while( e && e != edge_ );
      43                 :            :   }
      44                 :          0 :   return 0;
      45                 :            : }
      46                 :            : 
      47                 :            : 
      48                 :          0 : int PST_Point::faces( DLIList<PST_Face*>* list )
      49                 :            : {
      50                 :          0 :   int count = 0;
      51         [ #  # ]:          0 :   if( edge() )
      52                 :            :   {
      53                 :          0 :     PST_Edge* e = edge();
      54         [ #  # ]:          0 :     do
      55                 :            :     {
      56         [ #  # ]:          0 :       if (e->forward()->face())
      57                 :          0 :         e->forward()->face()->private_mark_ = true;
      58         [ #  # ]:          0 :       if (e->reverse()->face())
      59                 :          0 :         e->reverse()->face()->private_mark_ = true;
      60                 :          0 :       e = e->next(this);
      61                 :          0 :     } while( e != edge() );
      62                 :            :     
      63         [ #  # ]:          0 :     do
      64                 :            :     {
      65 [ #  # ][ #  # ]:          0 :       if( e->forward()->face() && e->forward()->face()->private_mark_ )
                 [ #  # ]
      66                 :            :       {
      67                 :          0 :         count++;
      68                 :          0 :         e->forward()->face()->private_mark_ = false;
      69 [ #  # ][ #  # ]:          0 :         if( list ) list->append(e->forward()->face());
      70                 :            :       }
      71 [ #  # ][ #  # ]:          0 :       if( e->reverse()->face() && e->reverse()->face()->private_mark_ )
                 [ #  # ]
      72                 :            :       {
      73                 :          0 :         count++;
      74                 :          0 :         e->reverse()->face()->private_mark_ = false;
      75 [ #  # ][ #  # ]:          0 :         if( list ) list->append(e->reverse()->face());
      76                 :            :       }
      77                 :          0 :       e = e->next(this);
      78                 :          0 :     } while( e != edge() );
      79                 :            :   }      
      80                 :            :   
      81                 :          0 :   return count;
      82                 :            : }
      83                 :            : 
      84                 :            : /*************************************************************************
      85                 :            :  *                               PST_Face
      86                 :            :  ************************************************************************/
      87                 :            : 
      88                 :          0 : void PST_Face::append_points( DLIList<PST_Point*>& result_list )
      89                 :            : {
      90                 :          0 :   PST_CoEdge* ce = coedge_;
      91                 :            : #ifndef NDEBUG
      92                 :          0 :   int debug = 0;
      93                 :            : #endif
      94         [ #  # ]:          0 :   do
      95                 :            :   {
      96         [ #  # ]:          0 :     result_list.append( ce->end_point() );
      97                 :          0 :     ce = ce->next();
      98                 :            :     
      99                 :            : #ifndef NDEBUG
     100         [ #  # ]:          0 :     assert( ++debug < PST_MAX_LIST_LEN );
     101                 :            : #endif
     102                 :          0 :   } while( ce != coedge_ );
     103                 :          0 : }
     104                 :            : 
     105                 :          0 : PST_Point* PST_Face::opposite( PST_Edge* edge )
     106                 :            : {
     107                 :          0 :   PST_CoEdge* ce = coedge_;
     108                 :            : #ifndef NDEBUG
     109                 :          0 :   int debug = 0;
     110                 :            : #endif
     111         [ #  # ]:          0 :   do
     112                 :            :   {
     113         [ #  # ]:          0 :     if( ce->edge() == edge )
     114                 :          0 :       return ce->next()->end_point();
     115                 :          0 :     ce = ce->next();
     116                 :            :     
     117                 :            : #ifndef NDEBUG
     118         [ #  # ]:          0 :     assert( ++debug < PST_MAX_LIST_LEN );
     119                 :            : #endif
     120                 :          0 :   } while( ce != coedge_ );
     121                 :            :   
     122                 :          0 :   return 0;
     123                 :            : }
     124                 :            : 
     125                 :          0 : PST_Edge* PST_Face::opposite( PST_Point* point )
     126                 :            : {
     127                 :          0 :   PST_CoEdge* ce = coedge_;
     128                 :            : #ifndef NDEBUG
     129                 :          0 :   int debug = 0;
     130                 :            : #endif
     131         [ #  # ]:          0 :   do
     132                 :            :   {
     133         [ #  # ]:          0 :     if( ce->start_point() == point )
     134                 :          0 :       return ce->next()->edge();
     135                 :          0 :     ce = ce->next();
     136                 :            :     
     137                 :            : #ifndef NDEBUG
     138         [ #  # ]:          0 :     assert( ++debug < PST_MAX_LIST_LEN );
     139                 :            : #endif
     140                 :          0 :   } while( ce != coedge_ );
     141                 :            :   
     142                 :          0 :   return 0;
     143                 :            : }
     144                 :            : 
     145                 :          0 : bool PST_Face::two_edges( PST_Point* point, PST_Edge*& e1, PST_Edge*& e2 )
     146                 :            : {
     147                 :          0 :   e1 = e2 = 0;
     148                 :          0 :   PST_CoEdge* ce = coedge_;
     149                 :            : #ifndef NDEBUG
     150                 :          0 :   int debug = 0;
     151                 :            : #endif
     152         [ #  # ]:          0 :   do
     153                 :            :   {
     154         [ #  # ]:          0 :     if( ce->end_point() == point )
     155                 :            :     {
     156 [ #  # ][ #  # ]:          0 :       if( e1 || e2 )
     157                 :          0 :         return false;
     158                 :          0 :       e1 = ce->edge();
     159                 :          0 :       e2 = ce->next()->edge();
     160                 :            :     }
     161                 :          0 :     ce = ce->next();
     162                 :            :     
     163                 :            : #ifndef NDEBUG
     164         [ #  # ]:          0 :     assert( ++debug < PST_MAX_LIST_LEN );
     165                 :            : #endif
     166                 :          0 :   } while( ce != coedge_ );
     167                 :            :   
     168 [ #  # ][ #  # ]:          0 :   return e1 && e2;
     169                 :            : }
     170                 :            : 
     171                 :            : 
     172                 :          0 : bool PST_Face::calculate_plane()
     173                 :            : {
     174                 :          0 :   update_plane_ = 0;
     175                 :            : 
     176                 :            :   // Use Newell's method
     177                 :            :   
     178 [ #  # ][ #  # ]:          0 :   CubitVector dif, sum, ref(0.,0.,0.);
                 [ #  # ]
     179         [ #  # ]:          0 :   CubitVector norm(0.,0.,0.);
     180                 :            :   
     181                 :            :   // For each coedge...
     182                 :            :   
     183                 :          0 :   PST_CoEdge* ce = coedge_;
     184                 :          0 :   int count = 0;
     185         [ #  # ]:          0 :   do
     186                 :            :   {
     187                 :          0 :     count++;
     188         [ #  # ]:          0 :     const CubitVector& pt1 = ce->start_coord();
     189         [ #  # ]:          0 :     const CubitVector& pt2 = ce->end_coord();
     190 [ #  # ][ #  # ]:          0 :     dif   = pt2 - pt1;
     191 [ #  # ][ #  # ]:          0 :     sum   = pt2 + pt1;
     192         [ #  # ]:          0 :     ref  += pt1;
     193 [ #  # ][ #  # ]:          0 :     norm += CubitVector( dif.y()*sum.z(), dif.z()*sum.x(), dif.x()*sum.y() );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     194         [ #  # ]:          0 :     ce = ce->next();
     195                 :            :     
     196         [ #  # ]:          0 :     assert( count < PST_MAX_LIST_LEN );
     197                 :          0 :   } while( ce != coedge_ );
     198                 :            :   
     199                 :            :   // Degenerate?
     200                 :            :   
     201         [ #  # ]:          0 :   double len = norm.length();
     202         [ #  # ]:          0 :   if( len > CUBIT_RESABS )
     203                 :            :   {
     204         [ #  # ]:          0 :     double d = (ref % norm) / (count * len);
     205         [ #  # ]:          0 :     norm /= -len; //reverse and normalize
     206                 :            : 
     207         [ #  # ]:          0 :     plane_.normal( norm );
     208         [ #  # ]:          0 :     plane_.coefficient( d );
     209                 :            : 
     210                 :          0 :     return true;
     211                 :            :   }
     212                 :            :   else
     213                 :            :   {
     214 [ #  # ][ #  # ]:          0 :     plane_.normal( CubitVector(0.,0.,0.) );
     215         [ #  # ]:          0 :     plane_.coefficient( 0. );
     216                 :            : 
     217                 :          0 :     return false;
     218                 :            :   }
     219                 :            : }      
     220                 :            :     
     221                 :            : 
     222                 :            : 
     223                 :            : /*************************************************************************
     224                 :            :  *                              PST_CoEdge
     225                 :            :  ************************************************************************/
     226                 :          0 : PST_CoEdge* PST_CoEdge::previous()
     227                 :            : {
     228         [ #  # ]:          0 :   if( !next_ )
     229                 :          0 :     return 0;
     230                 :            :     
     231                 :          0 :   PST_CoEdge* coedge = this;
     232                 :            : #ifndef NDEBUG
     233                 :          0 :   int debug = 0;
     234                 :            : #endif
     235         [ #  # ]:          0 :   while( coedge->next_ != this )
     236                 :            :   {
     237                 :          0 :     coedge = coedge->next_;
     238                 :            : #ifndef NDEBUG
     239         [ #  # ]:          0 :     assert( ++debug < PST_MAX_LIST_LEN );
     240                 :            : #endif
     241                 :            :   }
     242                 :          0 :   return coedge;
     243                 :            : }
     244                 :            : 
     245                 :            : /*************************************************************************
     246                 :            :  *                               PST_Edge
     247                 :            :  ************************************************************************/
     248                 :            : 
     249 [ #  # ][ #  # ]:          0 : PST_Edge::~PST_Edge()
     250                 :            : {
     251                 :            :     // Update list "head" pointers on points, if necessary.
     252 [ #  # ][ #  # ]:          0 :   if( start_point() )
     253         [ #  # ]:          0 :     remove_start_point();
     254 [ #  # ][ #  # ]:          0 :   if( end_point() )
     255         [ #  # ]:          0 :     remove_end_point();
     256                 :            : 
     257                 :            :     // Destroy parent facets
     258         [ #  # ]:          0 :   for ( int i = 0; i < 2; i++ )
     259                 :            :   {
     260 [ #  # ][ #  # ]:          0 :     PST_CoEdge* coedge = i ? reverse() : forward();
                 [ #  # ]
     261 [ #  # ][ #  # ]:          0 :     if ( coedge->face() )
     262                 :            :     {
     263         [ #  # ]:          0 :       PST_Face* face = coedge->face();
     264                 :          0 :       face->coedge_ = 0;
     265                 :            :       
     266                 :          0 :       PST_CoEdge* first = coedge;
     267         [ #  # ]:          0 :       do {
     268 [ #  # ][ #  # ]:          0 :         assert(coedge->face() == face);
     269                 :          0 :         coedge->face_ = 0;
     270         [ #  # ]:          0 :         PST_CoEdge* next = coedge->next();
     271                 :          0 :         coedge->next_ = 0;
     272                 :          0 :         coedge = next;
     273                 :            :       } while( first != coedge );
     274 [ #  # ][ #  # ]:          0 :       delete face ;
     275                 :            :     }
     276                 :            :   }
     277         [ #  # ]:          0 : }
     278                 :            :     
     279                 :          0 : double PST_Edge::closest_on_line( const CubitVector& P )
     280                 :            : {
     281 [ #  # ][ #  # ]:          0 :   CubitVector B = start_coord();
     282 [ #  # ][ #  # ]:          0 :   CubitVector M   = end_coord() - B;
     283 [ #  # ][ #  # ]:          0 :   if( M.length_squared() < RESABS_SQR )
     284                 :          0 :     return 0.0;
     285 [ #  # ][ #  # ]:          0 :   return ( M % ( P - B ) ) / ( M % M );
                 [ #  # ]
     286                 :            : }
     287                 :            : 
     288                 :          0 : double PST_Edge::closest_on_edge( const CubitVector& p )
     289                 :            : {
     290                 :          0 :   double t = closest_on_line( p );
     291         [ #  # ]:          0 :   if( t < 0.0 )
     292                 :          0 :     t = 0.0;
     293         [ #  # ]:          0 :   else if( t > 1.0 )
     294                 :          0 :     t = 1.0;
     295                 :          0 :   return t;
     296                 :            : }
     297                 :            : 
     298                 :          0 : double PST_Edge::closest_on_line( const CubitVector& B2, 
     299                 :            :                                   const CubitVector& M2 )
     300                 :            : {
     301 [ #  # ][ #  # ]:          0 :   CubitVector B1 = start_coord();
     302         [ #  # ]:          0 :   CubitVector M1 = direction();
     303                 :            :   
     304 [ #  # ][ #  # ]:          0 :   if( M1.length_squared() < RESABS_SQR )
     305                 :          0 :     return 0.0;
     306                 :            :   
     307 [ #  # ][ #  # ]:          0 :   if( M2.length_squared() < RESABS_SQR )
     308         [ #  # ]:          0 :     return closest_on_line( B2 );
     309                 :            :   
     310         [ #  # ]:          0 :   CubitVector cross = M2 * M1;
     311 [ #  # ][ #  # ]:          0 :   if( cross.length_squared() < CUBIT_RESABS ) //parallel
     312                 :          0 :     return 0.0;
     313                 :            :   
     314         [ #  # ]:          0 :   CubitVector N = M2 * cross;
     315         [ #  # ]:          0 :   double      D = -( N % B2 );
     316 [ #  # ][ #  # ]:          0 :   return -( N % B1 + D ) / ( N % M1 );
     317                 :            : }
     318                 :            : 
     319                 :            : 
     320                 :          0 : PST_Edge* PST_Edge::other( PST_Point* point, PST_Face* face )
     321                 :            : {
     322                 :          0 :   PST_Edge *result = 0;
     323         [ #  # ]:          0 :   for( PST_Edge* e = point->next(this); e != this; e = point->next(e) )
     324                 :            :   {
     325 [ #  # ][ #  # ]:          0 :     if( e->forward()->face() == face || e->reverse()->face() == face )
                 [ #  # ]
     326                 :            :     {
     327 [ #  # ][ #  # ]:          0 :       if( result && result != e )
     328                 :          0 :         return 0;
     329                 :          0 :       result = e;
     330                 :            :     }
     331                 :            :   }
     332                 :          0 :   return result;
     333                 :            : }
     334                 :            : 
     335                 :            : /*************************************************************************
     336                 :            :  *                         Construction Methods
     337                 :            :  ************************************************************************/
     338                 :            : 
     339                 :          0 : PST_Face* PST_Edge::create_face( PST_Point* pt1, PST_Point* pt2, PST_Point* pt3 )
     340                 :            : {
     341                 :            :     // It is trivial to generalize this function for creating
     342                 :            :     // faces with an arbitrary number of sides, but I just
     343                 :            :     // want triangles.
     344                 :          0 :   const int size = 3;
     345                 :          0 :   PST_Point* p[size] = { pt1, pt2, pt3 };
     346                 :            : 
     347                 :            :   int i;
     348                 :            :   PST_Edge* e[size];
     349                 :            :   PST_CoEdge* c[size];
     350                 :            :   
     351                 :            :     // Initialize edge and coedge arrays, creating
     352                 :            :     // edges if necessary.
     353         [ #  # ]:          0 :   for( i = 0; i < size; i++ )
     354                 :            :   {
     355         [ #  # ]:          0 :     e[i] = p[i]->common( p[(i+1)%size] );
     356         [ #  # ]:          0 :     if( !e[i] )
     357                 :            :     {
     358 [ #  # ][ #  # ]:          0 :       e[i] = new PST_Edge( p[i], p[(i+1)%size] );
     359         [ #  # ]:          0 :       c[i] = e[i]->forward();
     360                 :            :     }
     361                 :            :     else
     362                 :            :     {
     363 [ #  # ][ #  # ]:          0 :       c[i] = e[i]->start_point() == p[i] ? e[i]->forward() : e[i]->reverse();
         [ #  # ][ #  # ]
     364                 :            :       
     365                 :            :         // If the co-edge in the appropriate direction is already
     366                 :            :         // part of a face (other than the boundary face), then we
     367                 :            :         // can't proceed.
     368                 :            : //      if( !c[i]->face()->boundary() )
     369 [ #  # ][ #  # ]:          0 :       if( c[i]->face() )
     370                 :            :       {
     371         [ #  # ]:          0 :         while( --i >= 0 )
     372 [ #  # ][ #  # ]:          0 :           if( ! c[i]->face() )
     373 [ #  # ][ #  # ]:          0 :             delete e[i];
     374                 :          0 :         return 0;
     375                 :            :       }
     376                 :            :     }
     377                 :            :   }
     378                 :            :   
     379 [ #  # ][ #  # ]:          0 :   PST_Face* result = new PST_Face( c[0] );
     380         [ #  # ]:          0 :   for ( i = 0; i < size; i++ )
     381                 :            :   {
     382                 :          0 :     int next = (i + 1) % size;
     383                 :          0 :     c[i]->face_ = result;
     384                 :          0 :     c[i]->next_ = c[next];
     385                 :            :   }
     386                 :          0 :   return result;
     387                 :            : 
     388                 :            : }
     389                 :            : 
     390                 :            : 
     391                 :          0 : PST_Edge* PST_Edge::split_face( PST_Point* start, PST_Point* end, PST_Face* face )
     392                 :            : {
     393 [ #  # ][ #  # ]:          0 :   if( !start->edge_ || !end->edge_ )
     394                 :          0 :     return 0;
     395                 :            :   
     396         [ #  # ]:          0 :   if( ! face )
     397                 :            :   {
     398                 :          0 :     PST_Edge* start_edge = start->edge();
     399         [ #  # ]:          0 :     do
     400                 :            :     {
     401                 :          0 :       PST_Face* curr_face = start_edge->forward()->face();
     402                 :          0 :       PST_Face* rev_face = start_edge->reverse()->face();
     403                 :            :       while( true )
     404                 :            :       {
     405                 :          0 :         PST_CoEdge* coe = curr_face->coedge_;
     406         [ #  # ]:          0 :         do
     407                 :            :         {
     408         [ #  # ]:          0 :           if( coe->other( end ) )
     409                 :            :           {
     410         [ #  # ]:          0 :             if( face ) return 0;
     411                 :            :             
     412                 :          0 :             face = curr_face;
     413                 :          0 :             curr_face = rev_face;
     414                 :          0 :             break;
     415                 :            :           }
     416                 :          0 :           coe = coe->next();
     417                 :          0 :         } while( coe != curr_face->coedge_ );
     418                 :            :         
     419         [ #  # ]:          0 :         if( curr_face == rev_face )
     420                 :          0 :           break;
     421                 :            :         else
     422                 :          0 :           curr_face = rev_face;
     423                 :            :       }
     424                 :            : 
     425                 :          0 :       start_edge = start_edge->next(start);
     426                 :          0 :     } while( start_edge != start->edge() );
     427                 :            :     
     428         [ #  # ]:          0 :     if( !face ) return 0;
     429                 :            :   }
     430                 :            :   
     431                 :          0 :   PST_CoEdge* start_coedge = 0;
     432                 :          0 :   PST_CoEdge*   end_coedge = 0;
     433                 :            :   
     434                 :          0 :   PST_CoEdge* coedge = face->coedge_;
     435         [ #  # ]:          0 :   do
     436                 :            :   {
     437         [ #  # ]:          0 :     if( coedge->end_point() == start )
     438                 :            :     {
     439                 :          0 :       start_coedge = coedge;
     440                 :          0 :       break;
     441                 :            :     }
     442                 :          0 :     coedge = coedge->next();
     443                 :          0 :   } while( coedge != face->coedge_ );
     444                 :            :   
     445         [ #  # ]:          0 :   if( ! start_coedge ) 
     446                 :          0 :     return 0;
     447                 :            :   
     448                 :          0 :   coedge = start_coedge->next();
     449                 :          0 :   PST_CoEdge* stop = start_coedge;
     450         [ #  # ]:          0 :   do
     451                 :            :   {
     452         [ #  # ]:          0 :     if( coedge->end_point() == start )
     453                 :            :     {
     454                 :          0 :       start_coedge = coedge;
     455                 :            :     }
     456                 :            :    
     457         [ #  # ]:          0 :     if( coedge->end_point() == end )
     458                 :            :     {
     459                 :          0 :       end_coedge = coedge;
     460                 :          0 :       break;
     461                 :            :     }
     462                 :            :     
     463                 :          0 :     coedge = coedge->next();
     464                 :            :   } while( coedge != stop );
     465                 :            :   
     466         [ #  # ]:          0 :   if( ! end_coedge )
     467                 :          0 :     return 0;
     468                 :            :   
     469                 :            :   
     470                 :          0 :   return split_face( start_coedge, end_coedge );
     471                 :            : }
     472                 :            : 
     473                 :          0 : PST_Edge* PST_Edge::split_face( PST_CoEdge* coedge1, PST_CoEdge* coedge2 )
     474                 :            : {
     475                 :          0 :   PST_Point* point1 = coedge1->end_point();
     476                 :          0 :   PST_Point* point2 = coedge2->end_point();
     477                 :            :   
     478 [ #  # ][ #  # ]:          0 :   if( (coedge1->edge()      == coedge2->edge() ) ||
     479         [ #  # ]:          0 :       (coedge1->face()      != coedge2->face() ) ||
     480   [ #  #  #  # ]:          0 :       (point1               == point2          ) ||
     481                 :          0 :       ( point1->common( point2 )               ) )
     482                 :          0 :     return 0;
     483                 :            :   
     484         [ #  # ]:          0 :   PST_Edge* new_edge = new PST_Edge( point1, point2 );
     485                 :          0 :   new_edge->forward_.next_ = coedge2->next_;
     486                 :          0 :   new_edge->reverse_.next_ = coedge1->next_;
     487                 :          0 :   coedge1->next_ = new_edge->forward();
     488                 :          0 :   coedge2->next_ = new_edge->reverse();
     489                 :            :   
     490                 :          0 :   PST_Face* old_face = coedge1->face();
     491         [ #  # ]:          0 :   PST_Face* new_face = new PST_Face( new_edge->forward(), old_face );
     492                 :            :   //new_face->boundary(0);
     493                 :          0 :   old_face->coedge_ = new_edge->reverse();
     494                 :          0 :   new_edge->reverse_.face_ = old_face;
     495                 :            :   
     496                 :          0 :   coedge1 = new_edge->forward();
     497         [ #  # ]:          0 :   do
     498                 :            :   {
     499                 :          0 :     coedge1->face_ = new_face;
     500                 :          0 :     coedge1 = coedge1->next();
     501                 :          0 :   } while( coedge1 != new_edge->forward() );
     502                 :            : 
     503                 :          0 :   return new_edge;
     504                 :            : }
     505                 :            : 
     506                 :            : 
     507                 :          0 : PST_Edge* PST_Edge::insert_in_face( PST_Point* end, 
     508                 :            :                                     PST_CoEdge* after_this )
     509                 :            : {
     510         [ #  # ]:          0 :   if( end->edge_ )
     511                 :          0 :     return 0;
     512                 :            :   
     513                 :          0 :   PST_Point* start = after_this->end_point();
     514         [ #  # ]:          0 :   PST_Edge* new_edge = new PST_Edge( start, end );
     515                 :          0 :   new_edge->forward_.next_ = new_edge->reverse();
     516                 :          0 :   new_edge->reverse_.next_ = after_this->next_;
     517                 :          0 :   new_edge->forward_.face_ = new_edge->reverse_.face_ = after_this->face_;
     518                 :          0 :   after_this->next_ = new_edge->forward();
     519                 :          0 :   after_this->face_->modified(true);
     520                 :          0 :   return new_edge;
     521                 :            : }
     522                 :            : 
     523                 :            : 
     524                 :          0 : PST_Edge* PST_Edge::split( PST_Point* point )
     525                 :            : {
     526         [ #  # ]:          0 :   if( point->edge_ )
     527                 :          0 :     return 0; 
     528                 :            :   
     529         [ #  # ]:          0 :   PST_Edge* new_edge = new PST_Edge( point, end_ );
     530                 :            : 
     531         [ #  # ]:          0 :   if (forward()->face()) {
     532                 :          0 :     new_edge->forward_.face_ = forward_.face_;
     533                 :          0 :     new_edge->forward_.next_ = forward_.next_;
     534                 :          0 :     forward_.next_ = new_edge->forward();
     535                 :          0 :     forward_.face_->modified(true);
     536                 :            :   }
     537         [ #  # ]:          0 :   if (reverse()->face()) {
     538                 :          0 :     new_edge->reverse_.face_ = reverse_.face_;
     539                 :          0 :     new_edge->reverse_.next_ = reverse();
     540                 :          0 :     reverse_.previous()->next_ = new_edge->reverse();
     541                 :          0 :     reverse_.face_->modified(true);
     542                 :            :   }  
     543                 :            : 
     544                 :          0 :   set_end_point(point);
     545                 :            :   
     546                 :          0 :   return new_edge;
     547                 :            : }
     548                 :            : 
     549                 :            : 
     550                 :          0 : void PST_Edge::set_point( PST_Point* pt, 
     551                 :            :                           PST_Point*& ptr,
     552                 :            :                           PST_Edge*& next )
     553                 :            : {
     554         [ #  # ]:          0 :   if( ptr )
     555                 :          0 :     remove_point( ptr, next );
     556                 :            :   
     557                 :            :   
     558         [ #  # ]:          0 :   if( pt->edge_ )
     559                 :            :   {
     560         [ #  # ]:          0 :     if( pt->edge()->start_point() == pt )
     561                 :            :     {
     562                 :          0 :       next = pt->edge()->start_next_;
     563                 :          0 :       pt->edge()->start_next_ = this;
     564                 :            :     }
     565                 :            :     else
     566                 :            :     {
     567         [ #  # ]:          0 :       assert( pt->edge()->end_point() == pt );
     568                 :          0 :       next = pt->edge()->end_next_;
     569                 :          0 :       pt->edge()->end_next_ = this;
     570                 :            :     }
     571                 :            :   }
     572                 :            :   else
     573                 :            :   {
     574                 :          0 :     next = this;
     575                 :          0 :     pt->edge_ = this;
     576                 :            :   }
     577                 :            :     
     578                 :          0 :   ptr = pt;
     579                 :          0 : }
     580                 :            : 
     581                 :          0 : void PST_Edge::remove_point( PST_Point*& ptr, PST_Edge*& next )
     582                 :            : {
     583         [ #  # ]:          0 :   if( next == this )
     584                 :            :   {
     585                 :          0 :     ptr->edge_ = 0;
     586                 :          0 :     next= 0;
     587                 :          0 :     ptr = 0;
     588                 :          0 :     return;
     589                 :            :   }
     590                 :            :   
     591                 :          0 :   PST_Edge* prev = next;
     592         [ #  # ]:          0 :   while( prev->next(ptr) != this )
     593                 :            :   {
     594                 :          0 :     prev = prev->next(ptr);
     595         [ #  # ]:          0 :     assert( prev != next );
     596                 :            :   }
     597                 :            :   
     598         [ #  # ]:          0 :   if( prev->start_next_ == this )
     599                 :            :   {
     600                 :          0 :     prev->start_next_ = next;
     601                 :            :   }
     602                 :            :   else
     603                 :            :   {
     604         [ #  # ]:          0 :     assert(prev->end_next_ == this);
     605                 :          0 :     prev->end_next_ = next;
     606                 :            :   }
     607                 :            :   
     608         [ #  # ]:          0 :   if( ptr->edge_ == this )
     609                 :          0 :     ptr->edge_ = next;
     610                 :            : }
     611                 :            : 
     612                 :            : 
     613                 :          0 : void PST_Point::debug_draw( int color, bool flush )
     614                 :            : {
     615                 :          0 :   GfxDebug::draw_point( float(x()), float(y()), float(z()), color );
     616         [ #  # ]:          0 :   if( flush ) 
     617                 :          0 :     GfxDebug::flush();
     618                 :          0 : }
     619                 :            :   
     620                 :          0 : void PST_Edge::debug_draw( int color, bool flush )
     621                 :            : {
     622                 :            :   GfxDebug::draw_line( 
     623                 :          0 :     float(start_coord().x()), float(start_coord().y()), float(start_coord().z()),
     624                 :          0 :     float(  end_coord().x()), float(  end_coord().y()), float(  end_coord().z()),
     625                 :          0 :     color );
     626         [ #  # ]:          0 :   if( flush ) GfxDebug::flush();
     627                 :          0 : }
     628                 :            : 
     629                 :          0 : void PST_Face::debug_draw( int color, bool flush )
     630                 :            : {
     631                 :          0 :   PST_CoEdge* coedge = first_coedge();
     632         [ #  # ]:          0 :   do
     633                 :            :   {
     634                 :          0 :     coedge->edge()->debug_draw( color, false );
     635                 :          0 :     coedge = coedge->next();
     636                 :          0 :   } while( coedge != first_coedge() );
     637         [ #  # ]:          0 :   if( flush ) GfxDebug::flush();
     638                 :          0 : }
     639                 :            : 
     640                 :          0 : void PST_Edge::make_gmem( GMem& gmem, DLIList<PST_Face*>& facets )
     641                 :            : {
     642 [ #  # ][ #  # ]:          0 :   DLIList<PST_Point*> point_list, temp_list;
                 [ #  # ]
     643                 :            :   int i, j, pcount, fcount;
     644                 :            :   
     645 [ #  # ][ #  # ]:          0 :   for( i = facets.size(); i--; )
     646                 :            :   {
     647         [ #  # ]:          0 :     PST_Face* facet = facets.get_and_step();
     648                 :            : //    if( facet->boundary() )
     649                 :            : //      continue;
     650                 :            : 
     651         [ #  # ]:          0 :     temp_list.clean_out();
     652         [ #  # ]:          0 :     facet->append_points( temp_list );
     653 [ #  # ][ #  # ]:          0 :     for( j = temp_list.size(); j--; )
     654                 :            :     {
     655         [ #  # ]:          0 :       temp_list.get_and_step()->mark = -1;
     656                 :            :     }
     657                 :            :   }
     658                 :            :   
     659                 :          0 :   pcount = 0;
     660                 :          0 :   fcount = 0;
     661 [ #  # ][ #  # ]:          0 :   for( i = facets.size(); i--; )
     662                 :            :   {
     663         [ #  # ]:          0 :     PST_Face* facet = facets.get_and_step();
     664                 :            : //    if( facet->boundary() )
     665                 :            : //      continue;
     666                 :            :     
     667         [ #  # ]:          0 :     temp_list.clean_out();
     668         [ #  # ]:          0 :     facet->append_points( temp_list );
     669         [ #  # ]:          0 :     fcount += temp_list.size() + 1;
     670 [ #  # ][ #  # ]:          0 :     for( j = temp_list.size(); j--; )
     671                 :            :     {
     672         [ #  # ]:          0 :       PST_Point* pt_ptr = temp_list.get_and_step();
     673         [ #  # ]:          0 :       if( pt_ptr->mark == -1 )
     674                 :            :       {
     675                 :          0 :         pt_ptr->mark = pcount++;
     676         [ #  # ]:          0 :         point_list.append( pt_ptr );
     677                 :            :       }
     678                 :            :     }
     679                 :            :   }
     680                 :            :   
     681 [ #  # ][ #  # ]:          0 :   gmem.allocate_tri( facets.size() );
     682         [ #  # ]:          0 :   gmem.pointListCount = point_list.size();
     683         [ #  # ]:          0 :   GPoint* pt_array = gmem.point_list();
     684                 :            :   
     685         [ #  # ]:          0 :   point_list.reset();
     686 [ #  # ][ #  # ]:          0 :   for( i = 0; i < point_list.size(); i++ )
     687                 :            :   {
     688         [ #  # ]:          0 :     PST_Point* pt_ptr = point_list.get_and_step();
     689         [ #  # ]:          0 :     pt_array[i].x = float(pt_ptr->x());
     690         [ #  # ]:          0 :     pt_array[i].y = float(pt_ptr->y());
     691         [ #  # ]:          0 :     pt_array[i].z = float(pt_ptr->z());
     692                 :            :   }
     693                 :            :   
     694         [ #  # ]:          0 :   gmem.fListCount = facets.size() * 4;
     695         [ #  # ]:          0 :   int* offset = gmem.facet_list();
     696 [ #  # ][ #  # ]:          0 :   for( i = facets.size(); i--; )
     697                 :            :   {
     698                 :            : //    if( facets.get()->boundary() )
     699                 :            : //      continue;
     700                 :            :       
     701         [ #  # ]:          0 :     temp_list.clean_out();
     702 [ #  # ][ #  # ]:          0 :     facets.get_and_step()->append_points( temp_list );
     703         [ #  # ]:          0 :     *(offset++) = temp_list.size();
     704 [ #  # ][ #  # ]:          0 :     for( j = temp_list.size(); j--; )
     705                 :            :     {
     706         [ #  # ]:          0 :       *(offset++) = temp_list.get_and_step()->mark;
     707                 :            :     }
     708         [ #  # ]:          0 :   }
     709                 :          0 : }
     710                 :            : 
     711                 :          0 : void PST_Edge::make_gmem( GMem& gmem, DLIList<PST_Edge*>& edges )
     712                 :            : {
     713         [ #  # ]:          0 :   DLIList<PST_Face*> face_list;
     714         [ #  # ]:          0 :   PST_Edge::faces( edges, face_list );
     715 [ #  # ][ #  # ]:          0 :   make_gmem( gmem, face_list );
     716                 :          0 : }
     717                 :            : 
     718                 :          0 : void PST_Point::debug_draw_points( DLIList<PST_Point*>& point_list, int color, bool flush )
     719                 :            : {
     720         [ #  # ]:          0 :   for( int p = point_list.size(); p--; )
     721                 :          0 :     point_list.get_and_step()->debug_draw(color, false);
     722         [ #  # ]:          0 :   if( flush ) GfxDebug::flush();
     723                 :          0 : }
     724                 :            : 
     725                 :          0 : void PST_Edge::debug_draw_points( DLIList<PST_Edge*>& edge_list, 
     726                 :            :                             int color, int boundary_color, bool flush )
     727                 :            : {
     728         [ #  # ]:          0 :   if( ! boundary_color ) boundary_color = color;
     729                 :            :   
     730         [ #  # ]:          0 :   DLIList<PST_Point*> point_list;
     731 [ #  # ][ #  # ]:          0 :   DLIList<PST_Point*> boundary_list;
     732         [ #  # ]:          0 :   PST_Edge::points( edge_list, point_list );
     733 [ #  # ][ #  # ]:          0 :   for( int i = point_list.size(); i--; )
     734                 :            :   {
     735         [ #  # ]:          0 :      PST_Point* pt = point_list.step_and_get();
     736         [ #  # ]:          0 :      PST_Edge* e = pt->edge();
     737         [ #  # ]:          0 :      do
     738                 :            :      {
     739 [ #  # ][ #  # ]:          0 :        if( !e->forward()->face() || !e->reverse()->face() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     740                 :          0 :          break;
     741         [ #  # ]:          0 :        e = e->next(pt);
     742         [ #  # ]:          0 :      } while( e != pt->edge() );
     743 [ #  # ][ #  # ]:          0 :      if( !e->forward()->face() || !e->reverse()->face() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     744                 :            :      {
     745         [ #  # ]:          0 :        point_list.change_to( 0 );
     746         [ #  # ]:          0 :        boundary_list.append( pt );
     747                 :            :      }
     748                 :            :   }
     749         [ #  # ]:          0 :   point_list.remove_all_with_value(0);
     750                 :            :   
     751         [ #  # ]:          0 :   PST_Point::debug_draw_points( point_list, color, false );
     752 [ #  # ][ #  # ]:          0 :   PST_Point::debug_draw_points( boundary_list, boundary_color, flush );
     753                 :          0 : }
     754                 :            : 
     755                 :          0 : void PST_Edge::debug_draw_edges(  DLIList<PST_Edge*>& edge_list,
     756                 :            :                             int color, int boundary_color,
     757                 :            :                             bool flush )
     758                 :            : {
     759         [ #  # ]:          0 :   if( !boundary_color ) boundary_color = color;
     760                 :            :   
     761         [ #  # ]:          0 :   for( int e = edge_list.size(); e--; )
     762                 :            :   {
     763                 :          0 :     PST_Edge* edge_ptr = edge_list.get_and_step();
     764         [ #  # ]:          0 :     int c = !edge_ptr->forward()->face() || !edge_ptr->reverse()->face()
     765         [ #  # ]:          0 :        ? boundary_color : color;
     766                 :          0 :     edge_ptr->debug_draw( c, false );
     767                 :            :   }
     768         [ #  # ]:          0 :   if( flush ) GfxDebug::flush();
     769                 :          0 : }
     770                 :            : 
     771                 :          0 : void PST_Edge::debug_draw_faces( DLIList<PST_Edge*>& edge_list, int color, bool flush )
     772                 :            : {
     773         [ #  # ]:          0 :   DLIList<PST_Face*> face_list;
     774         [ #  # ]:          0 :   PST_Edge::faces( edge_list, face_list );
     775 [ #  # ][ #  # ]:          0 :   PST_Face::debug_draw_faces( face_list, color, flush );
     776                 :          0 : }
     777                 :            : 
     778                 :          0 : void PST_Edge::faces( DLIList<PST_Edge*>& edges, DLIList<PST_Face*>& faces )
     779                 :            : {
     780                 :            :   int e;
     781         [ #  # ]:          0 :   for( e = edges.size(); e--; )
     782                 :            :   {
     783                 :          0 :     PST_Edge* edge_ptr = edges.get_and_step();
     784         [ #  # ]:          0 :     if( edge_ptr->forward()->face() )
     785                 :          0 :       edge_ptr->forward()->face()->private_mark_ = 1;
     786         [ #  # ]:          0 :     if( edge_ptr->reverse()->face() )
     787                 :          0 :       edge_ptr->reverse()->face()->private_mark_ = 1;
     788                 :            :   }
     789         [ #  # ]:          0 :   for( e = edges.size(); e--; )
     790                 :            :   {
     791         [ #  # ]:          0 :     PST_Edge* edge_ptr = edges.get_and_step();
     792 [ #  # ][ #  # ]:          0 :     PST_Face* fface_ptr = edge_ptr->forward()->face();
     793 [ #  # ][ #  # ]:          0 :     PST_Face* rface_ptr = edge_ptr->reverse()->face();
     794 [ #  # ][ #  # ]:          0 :     if( fface_ptr && fface_ptr->private_mark_ )
     795                 :            :     {
     796                 :          0 :       fface_ptr->private_mark_ = 0;
     797         [ #  # ]:          0 :       faces.append( fface_ptr );
     798                 :            :     }
     799 [ #  # ][ #  # ]:          0 :     if( rface_ptr && rface_ptr->private_mark_ )
     800                 :            :     {
     801                 :          0 :       rface_ptr->private_mark_ = 0;
     802         [ #  # ]:          0 :       faces.append( rface_ptr );
     803                 :            :     }
     804                 :            :   }
     805                 :          0 : }
     806                 :            : 
     807                 :          0 : void PST_Edge::edges( DLIList<PST_Face*>& faces, DLIList<PST_Edge*>& edges )
     808                 :            : {
     809                 :            :   int f;
     810         [ #  # ]:          0 :   for( f = faces.size(); f--; )
     811                 :            :   {
     812                 :          0 :     PST_CoEdge* first = faces.get_and_step()->first_coedge();
     813                 :          0 :     PST_CoEdge* coedge = first;
     814         [ #  # ]:          0 :     do
     815                 :            :     {
     816                 :          0 :       coedge->edge()->private_mark_ = 1;
     817                 :          0 :       coedge = coedge->next();
     818                 :            :     } while( coedge != first );
     819                 :            :   }
     820                 :            :   
     821         [ #  # ]:          0 :   for( f = faces.size(); f--; )
     822                 :            :   {
     823                 :          0 :     PST_CoEdge* first = faces.get_and_step()->first_coedge();
     824                 :          0 :     PST_CoEdge* coedge = first;
     825         [ #  # ]:          0 :     do
     826                 :            :     {
     827         [ #  # ]:          0 :       if( coedge->edge()->private_mark_ )
     828                 :            :       {
     829                 :          0 :         coedge->edge()->private_mark_ = 0;
     830         [ #  # ]:          0 :         edges.append( coedge->edge() );
     831                 :            :       }
     832                 :          0 :       coedge = coedge->next();
     833                 :            :     } while( coedge != first );
     834                 :            :   }
     835                 :          0 : }  
     836                 :            : 
     837                 :          0 : void PST_Edge::edges( DLIList<PST_Point*>& pts, DLIList<PST_Edge*>& edges )
     838                 :            : {
     839                 :            :   int p;
     840         [ #  # ]:          0 :   for( p = pts.size(); p--; )
     841                 :            :   {
     842                 :          0 :     PST_Point* pt = pts.get_and_step();
     843                 :          0 :     PST_Edge* edge = pt->edge();
     844   [ #  #  #  # ]:          0 :     if( edge ) do
     845                 :            :     {
     846                 :          0 :       edge->private_mark_ = 1;
     847                 :          0 :       edge = edge->next( pt );
     848                 :          0 :     } while( edge != pt->edge() );
     849                 :            :   }
     850                 :            :   
     851         [ #  # ]:          0 :   for( p = pts.size(); p--; )
     852                 :            :   {
     853         [ #  # ]:          0 :     PST_Point* pt = pts.get_and_step();
     854         [ #  # ]:          0 :     PST_Edge* edge = pt->edge();
     855 [ #  # ][ #  # ]:          0 :     if( edge ) do
     856                 :            :     {
     857         [ #  # ]:          0 :       if( edge->private_mark_ )
     858                 :            :       {
     859                 :          0 :         edge->private_mark_ = 0;
     860         [ #  # ]:          0 :         edges.append( edge );
     861                 :            :       }
     862         [ #  # ]:          0 :       edge = edge->next( pt );
     863         [ #  # ]:          0 :     } while( edge != pt->edge() );
     864                 :            :   }
     865                 :          0 : }
     866                 :            : 
     867                 :            : 
     868                 :          0 : void PST_Edge::points( DLIList<PST_Edge*>& edges, DLIList<PST_Point*>& points )
     869                 :            : {
     870                 :            :   int e;
     871         [ #  # ]:          0 :   for( e = edges.size(); e--; )
     872                 :            :   {
     873                 :          0 :     PST_Edge* edge_ptr = edges.get_and_step();
     874                 :          0 :     edge_ptr->start_point()->private_mark_ = 1;
     875                 :          0 :     edge_ptr->end_point()->private_mark_ = 1;
     876                 :            :   }
     877         [ #  # ]:          0 :   for( e = edges.size(); e--; )
     878                 :            :   {
     879         [ #  # ]:          0 :     PST_Edge* edge_ptr = edges.get_and_step();
     880         [ #  # ]:          0 :     PST_Point* sp = edge_ptr->start_point();
     881         [ #  # ]:          0 :     PST_Point* ep = edge_ptr->end_point();
     882         [ #  # ]:          0 :     if( sp->private_mark_ )
     883                 :            :     {
     884                 :          0 :       sp->private_mark_ = 0;
     885         [ #  # ]:          0 :       points.append( sp );
     886                 :            :     }
     887         [ #  # ]:          0 :     if( ep->private_mark_ )
     888                 :            :     {
     889                 :          0 :       ep->private_mark_ = 0;
     890         [ #  # ]:          0 :       points.append( ep );
     891                 :            :     }
     892                 :            :   }
     893                 :          0 : }
     894                 :            : 
     895                 :          0 : void PST_Face::debug_draw_faces( DLIList<PST_Face*>& face_list, int color, bool flush )
     896                 :            : {
     897         [ #  # ]:          0 :   for( int f = face_list.size(); f--; )
     898                 :          0 :     face_list.get_and_step()->debug_draw( color, false );
     899         [ #  # ]:          0 :   if( flush ) GfxDebug::flush();
     900                 :          0 : }
     901                 :            : 
     902                 :          0 : void PST_Edge::make_facets( GMem& gmem, double tolerance, 
     903                 :            :                             DLIList<PST_Edge*>& edge_list )
     904                 :            : {
     905         [ #  # ]:          0 :   assert(gmem.fListCount % 4 == 0);
     906         [ #  # ]:          0 :   std::vector<double> points(gmem.pointListCount*3);
     907 [ #  # ][ #  # ]:          0 :   std::vector<int> facets(gmem.fListCount*3/4);
     908                 :            :   int i;
     909         [ #  # ]:          0 :   GPoint* pitor = gmem.point_list();
     910         [ #  # ]:          0 :   std::vector<double>::iterator ditor = points.begin();
     911         [ #  # ]:          0 :   for ( i = gmem.pointListCount; i--; )
     912                 :            :   {
     913 [ #  # ][ #  # ]:          0 :     *ditor++ = pitor->x;
     914 [ #  # ][ #  # ]:          0 :     *ditor++ = pitor->y;
     915 [ #  # ][ #  # ]:          0 :     *ditor++ = pitor->z;
     916                 :          0 :     pitor++;
     917                 :            :   }
     918                 :            :   
     919         [ #  # ]:          0 :   int* fitor = gmem.facet_list();
     920         [ #  # ]:          0 :   std::vector<int>::iterator iitor = facets.begin();
     921         [ #  # ]:          0 :   for ( i = 0; i < gmem.fListCount; i += 4 )
     922                 :            :   {
     923         [ #  # ]:          0 :     assert( *fitor++ == 3 );
     924 [ #  # ][ #  # ]:          0 :     *iitor++ = *fitor++;
     925 [ #  # ][ #  # ]:          0 :     *iitor++ = *fitor++;
     926 [ #  # ][ #  # ]:          0 :     *iitor++ = *fitor++;
     927                 :            :   }
     928                 :            :    
     929 [ #  # ][ #  # ]:          0 :   make_facets( points, facets, tolerance, edge_list ); 
     930                 :          0 : }
     931                 :            : 
     932                 :          0 : void PST_Edge::make_facets( 
     933                 :            :     const std::vector<double>& coordinates,
     934                 :            :     const std::vector<int>& connections,
     935                 :            :     double tolerance, 
     936                 :            :     DLIList<PST_Edge*>& edge_list )
     937                 :            : {
     938         [ #  # ]:          0 :   DLIList<PST_Face*> face_list;
     939                 :          0 :   double tol_sqr = tolerance * tolerance;
     940                 :            :   int i, j, k, numcoords, numtriangles;
     941                 :            :   
     942         [ #  # ]:          0 :   numcoords = coordinates.size()/3;
     943         [ #  # ]:          0 :   numtriangles = connections.size()/3;
     944                 :            :   //The list of points created.
     945 [ #  # ][ #  # ]:          0 :   PST_Point** ptlist = new PST_Point*[numcoords];
     946                 :            :   
     947                 :            :   //The list of indices into ptlist, where the index into this
     948                 :            :   //list is the same as the index into the point list, and
     949                 :            :   //the value in this list is the index of the corresponding 
     950                 :            :   //point in ptlist.  This is used because some points will
     951                 :            :   //be merged due to the tolerance.  
     952 [ #  # ][ #  # ]:          0 :   int* ptindex_list = new int[numcoords];
     953                 :            :    
     954                 :            :   //Create the points
     955                 :          0 :   k = 0;
     956         [ #  # ]:          0 :   for( i = 0; i < numcoords; i++ )
     957                 :            :   {
     958 [ #  # ][ #  # ]:          0 :     CubitVector pos( coordinates[3*i], coordinates[3*i+1], coordinates[3*i+2] );
         [ #  # ][ #  # ]
     959                 :            :  
     960                 :            :     //Check if we need to merge this point with a different point
     961         [ #  # ]:          0 :     for( j = 0; j < k; j++ )
     962                 :            :     {
     963 [ #  # ][ #  # ]:          0 :       if( (*(ptlist[j]) - pos).length_squared() <= tol_sqr )
                 [ #  # ]
     964                 :          0 :         break;
     965                 :            :     }
     966         [ #  # ]:          0 :     if( j == k )
     967                 :            :     {
     968 [ #  # ][ #  # ]:          0 :       ptlist[k] = new PST_Point( pos );
     969                 :          0 :       ptlist[k++]->sequence = i;
     970                 :            :     }
     971                 :          0 :     ptindex_list[i] = j;
     972                 :            :   } 
     973                 :            :   
     974                 :          0 :   int fail_count = 0;
     975         [ #  # ]:          0 :   for ( i = 0; i < numtriangles; i++ )
     976                 :            :   {
     977         [ #  # ]:          0 :     int i1 = ptindex_list[connections[3*i  ]];
     978         [ #  # ]:          0 :     int i2 = ptindex_list[connections[3*i+1]];
     979         [ #  # ]:          0 :     int i3 = ptindex_list[connections[3*i+2]];
     980 [ #  # ][ #  # ]:          0 :     if ( i1 == i2 || i2 == i3 || i3 == i1 )
                 [ #  # ]
     981                 :            :     {
     982 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Degenerate facet encountered in PST_Edge::make_facets()\n");
         [ #  # ][ #  # ]
     983                 :          0 :       fail_count++;
     984                 :            :     }
     985                 :            :     else
     986                 :            :     {
     987                 :            :       PST_Face* new_face 
     988         [ #  # ]:          0 :         = PST_Edge::create_face( ptlist[i1], ptlist[i2], ptlist[i3] );
     989         [ #  # ]:          0 :       if( new_face ){
     990         [ #  # ]:          0 :         face_list.append(new_face);
     991                 :          0 :         new_face->sequence = i;
     992                 :            :       }
     993                 :            :       else{
     994                 :          0 :         fail_count++;
     995                 :            :       }
     996                 :            :     }
     997                 :            :   }
     998                 :            :    
     999         [ #  # ]:          0 :   if( fail_count > 0 )
    1000 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Failed to construct %d facets in PST_Data::make_facets(..)\n",
                 [ #  # ]
    1001         [ #  # ]:          0 :       fail_count);
    1002                 :            :    
    1003         [ #  # ]:          0 :   delete [] ptindex_list;
    1004         [ #  # ]:          0 :   delete [] ptlist;
    1005                 :            :   
    1006         [ #  # ]:          0 :   if(fail_count == 0)
    1007                 :            :   {
    1008         [ #  # ]:          0 :     PST_Edge::edges( face_list, edge_list );
    1009         [ #  # ]:          0 :     validate( edge_list, true );
    1010                 :          0 :     bool debug1 = false;
    1011         [ #  # ]:          0 :     if (debug1)
    1012         [ #  # ]:          0 :       debug_draw_edges( edge_list, CUBIT_BLUE_INDEX, CUBIT_RED_INDEX, true );
    1013         [ #  # ]:          0 :   }
    1014                 :          0 : }
    1015                 :            : 
    1016                 :          0 : int PST_Point::validate(CubitBoolean print)
    1017                 :            : {
    1018 [ #  # ][ #  # ]:          0 :   if( edge_ && !edge_->other(this) )
                 [ #  # ]
    1019                 :            :   {
    1020         [ #  # ]:          0 :     if( print )
    1021                 :            :     {
    1022 [ #  # ][ #  # ]:          0 :       PRINT_INFO("Bad point->edge link.  Point %p, Edge %p.\n", (void*)this, (void*)edge_);
    1023                 :            :     }
    1024                 :          0 :     return 1;
    1025                 :            :   }
    1026                 :          0 :   return 0;
    1027                 :            : }
    1028                 :            : 
    1029                 :          0 : int PST_Edge::validate(CubitBoolean print)
    1030                 :            : {
    1031                 :          0 :   int result = 0;
    1032                 :          0 :   int count = 0;
    1033                 :          0 :   PST_Edge* edge = 0;
    1034                 :            : 
    1035         [ #  # ]:          0 :   if( !start_ )
    1036                 :            :   {
    1037 [ #  # ][ #  # ]:          0 :     if( print ) PRINT_ERROR("Edge %p has null start point.\n", (void*)this);
                 [ #  # ]
    1038                 :          0 :     result++;
    1039                 :            :   }
    1040                 :            :   else 
    1041                 :            :   {
    1042                 :          0 :     result += start_->validate(print);
    1043                 :            :   
    1044                 :          0 :     edge = this;
    1045                 :          0 :     count = 0;
    1046         [ #  # ]:          0 :     do
    1047                 :            :     {
    1048         [ #  # ]:          0 :       if( count++ > PST_MAX_LIST_LEN )
    1049                 :            :       {
    1050         [ #  # ]:          0 :         if( print )
    1051                 :            :         {
    1052 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("Bad edge list around Point %p.\n", (void*)start_);
    1053                 :            :         }
    1054                 :          0 :         result++;
    1055                 :          0 :         break;
    1056                 :            :       }
    1057                 :          0 :       edge = edge->next( start_ );
    1058                 :            :     } while( edge != this );
    1059                 :            :   }  
    1060                 :            : 
    1061                 :            :   
    1062         [ #  # ]:          0 :   if( !end_ )
    1063                 :            :   {
    1064 [ #  # ][ #  # ]:          0 :     if( print ) PRINT_ERROR("Edge %p has null end point.\n", (void*)this);
                 [ #  # ]
    1065                 :          0 :     result++;
    1066                 :            :   }
    1067                 :            :   else 
    1068                 :            :   {
    1069                 :          0 :     result += end_->validate(print);
    1070                 :            : 
    1071                 :          0 :     count = 0;
    1072                 :          0 :     edge = this;
    1073         [ #  # ]:          0 :     do
    1074                 :            :     {
    1075         [ #  # ]:          0 :       if( count++ > PST_MAX_LIST_LEN )
    1076                 :            :       {
    1077         [ #  # ]:          0 :         if( print )
    1078                 :            :         {
    1079 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("Bad edge list around Point %p.\n", (void*)end_);
    1080                 :            :         }
    1081                 :          0 :         result++;
    1082                 :          0 :         break;
    1083                 :            :       }
    1084                 :          0 :       edge = edge->next( end_ );
    1085                 :            :     } while( edge != this );
    1086                 :            :   }
    1087                 :            :   
    1088 [ #  # ][ #  # ]:          0 :   if (forward_.face_ && !forward_.next_)
    1089                 :            :   {
    1090         [ #  # ]:          0 :     if( print )
    1091         [ #  # ]:          0 :       PRINT_ERROR("Forward CoEdge on Edge %p as Face %p but no next().\n",
    1092         [ #  # ]:          0 :         (void*)this, (void*)forward_.face_);
    1093                 :          0 :     count++;
    1094                 :            :   }
    1095                 :            :   
    1096 [ #  # ][ #  # ]:          0 :   if (reverse_.face_ && !reverse_.next_)
    1097                 :            :   {
    1098         [ #  # ]:          0 :     if( print )
    1099         [ #  # ]:          0 :       PRINT_ERROR("Reverse CoEdge on Edge %p as Face %p but no next().\n",
    1100         [ #  # ]:          0 :         (void*)this, (void*)reverse_.face_);
    1101                 :          0 :     count++;
    1102                 :            :   }
    1103                 :            :   
    1104 [ #  # ][ #  # ]:          0 :   if (!forward_.face_ && forward_.next_)
    1105                 :            :   {
    1106         [ #  # ]:          0 :     if( print )
    1107         [ #  # ]:          0 :       PRINT_ERROR("Forward CoEdge on Edge %p as %p as next CoEdge but no Face.\n",
    1108         [ #  # ]:          0 :         (void*)this, (void*)forward_.next_);
    1109                 :          0 :     count++;
    1110                 :            :   }
    1111                 :            :   
    1112 [ #  # ][ #  # ]:          0 :   if (!reverse_.face_ && reverse_.next_)
    1113                 :            :   {
    1114         [ #  # ]:          0 :     if( print )
    1115         [ #  # ]:          0 :       PRINT_ERROR("Reverse CoEdge on Edge %p as %p as next CoEdge but no Face.\n",
    1116         [ #  # ]:          0 :         (void*)this, (void*)reverse_.next_);
    1117                 :          0 :     count++;
    1118                 :            :   }
    1119                 :            :     
    1120                 :          0 :   return result;
    1121                 :            : }
    1122                 :            : 
    1123                 :          0 : int PST_CoEdge::validate( CubitBoolean print )
    1124                 :            : {
    1125                 :          0 :   int result = 0;
    1126         [ #  # ]:          0 :   if( ! edge_ )
    1127                 :            :   {
    1128 [ #  # ][ #  # ]:          0 :     if( print ) PRINT_ERROR("Coedge %p has null edge.\n", (void*)this);
                 [ #  # ]
    1129                 :          0 :     result++;
    1130                 :            :   }
    1131                 :            :   else 
    1132                 :            :   {
    1133         [ #  # ]:          0 :     if( ! edge_->other( this ) )
    1134                 :            :     {
    1135         [ #  # ]:          0 :       if( print ) 
    1136         [ #  # ]:          0 :         PRINT_ERROR( "Inconsistent coedge->edge link.  CoEdge: %p  Edge: %p\n",
    1137         [ #  # ]:          0 :           (void*)edge_, (void*)this );
    1138                 :          0 :       result++;
    1139                 :            :     }
    1140                 :          0 :     result += edge_->validate(print);
    1141                 :            :   }
    1142                 :          0 :   return result;
    1143                 :            : }
    1144                 :            :       
    1145                 :          0 : int PST_Face::validate( CubitBoolean print )
    1146                 :            : {
    1147                 :          0 :   PST_CoEdge* coe = coedge_;
    1148                 :            :   
    1149         [ #  # ]:          0 :   if( !coedge_ )
    1150                 :            :   {
    1151 [ #  # ][ #  # ]:          0 :     if(print) PRINT_ERROR("Face %p has null loop.\n", (void*)this);
                 [ #  # ]
    1152                 :          0 :     return 1;
    1153                 :            :   }
    1154                 :            :   
    1155                 :          0 :   int count = 0;
    1156                 :          0 :   int result = 0;
    1157         [ #  # ]:          0 :   do
    1158                 :            :   {
    1159         [ #  # ]:          0 :     if( count++ > PST_MAX_LIST_LEN )
    1160                 :            :     {
    1161 [ #  # ][ #  # ]:          0 :       if( print ) PRINT_ERROR("Face %p loop is infinite.\n", (void*)this);
                 [ #  # ]
    1162                 :          0 :       result++;
    1163                 :          0 :       break;
    1164                 :            :     }
    1165                 :            :     
    1166         [ #  # ]:          0 :     if( coe->face() != this )
    1167                 :            :     {
    1168         [ #  # ]:          0 :       if( print ) 
    1169         [ #  # ]:          0 :         PRINT_ERROR("Loop for face %p contains face %p on edge %p.\n",
    1170         [ #  # ]:          0 :           (void*)this, (void*)coe->face(), (void*)coe->edge() );
    1171                 :          0 :       result++;
    1172                 :            :     }
    1173                 :            :     
    1174         [ #  # ]:          0 :     if( coe->edge() )
    1175                 :            :     {
    1176                 :          0 :       result += coe->edge()->validate( print );
    1177                 :            :     }
    1178                 :            :     else
    1179                 :            :     {
    1180         [ #  # ]:          0 :       if( print )
    1181 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("Coedge %p in face %p has null edge.\n", (void*)coe, (void*)this);
    1182                 :          0 :       result++;
    1183                 :            :     }
    1184                 :            :     
    1185         [ #  # ]:          0 :     if( ! coe->next() )
    1186                 :            :     {
    1187         [ #  # ]:          0 :       if( print ) 
    1188 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("Null coedge after coedge %p in face %p.\n", (void*)coe, (void*)this );
    1189                 :          0 :       result++;
    1190                 :          0 :       break;
    1191                 :            :     }
    1192                 :            : 
    1193                 :          0 :     coe = coe->next();
    1194                 :            :     
    1195                 :          0 :   } while( coe != coedge_ );
    1196                 :            :   
    1197                 :          0 :   return result;
    1198                 :            : }
    1199                 :            : 
    1200                 :          0 : int PST_Edge::validate( DLIList<PST_Edge*>& edges, CubitBoolean print )
    1201                 :            : {
    1202         [ #  # ]:          0 :   DLIList<PST_Face*> faces;
    1203         [ #  # ]:          0 :   PST_Edge::faces( edges, faces );
    1204                 :            :   
    1205                 :          0 :   int result = 0;
    1206 [ #  # ][ #  # ]:          0 :   for( int f = faces.size(); f--; )
    1207 [ #  # ][ #  # ]:          0 :     result += faces.get_and_step()->validate(print);
    1208         [ #  # ]:          0 :   return result;
    1209                 :            : }
    1210                 :            : 
    1211                 :          0 : void PST_Face::print()
    1212                 :            : {
    1213         [ #  # ]:          0 :   if( ! coedge_ )
    1214                 :            :   {
    1215 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Face %p has null coedge.\n", (void*)this);
    1216                 :          0 :     return;
    1217                 :            :   }
    1218                 :            :   
    1219         [ #  # ]:          0 :   PRINT_INFO("Face        CoEdge       Edge         Start Pt     End Pt\n"
    1220         [ #  # ]:          0 :              "----------  -----------  -----------  -----------  -----------\n" );
    1221                 :          0 :   PST_CoEdge* coe = coedge_;
    1222         [ #  # ]:          0 :     PRINT_INFO("%10p %10p  %10p  %10p  %10p\n",
    1223         [ #  # ]:          0 :       (void*)this, (void*)coe, (void*)coe->edge(), (void*)coe->start_point(), (void*)coe->end_point() );
    1224                 :          0 :   coe = coe->next();
    1225 [ #  # ][ #  # ]:          0 :   while( coe && coe != coedge_ )
    1226                 :            :   {
    1227         [ #  # ]:          0 :     PRINT_INFO("            %10p  %10p  %10p  %10p\n",
    1228         [ #  # ]:          0 :       (void*)coe, (void*)coe->edge(), (void*)coe->start_point(), (void*)coe->end_point() );
    1229                 :          0 :     coe = coe->next();
    1230                 :            :   }
    1231                 :            : }
    1232                 :            : 
    1233                 :          0 : void PST_Edge::print()
    1234                 :            : {
    1235         [ #  # ]:          0 :   PRINT_INFO("Edge %p:  Points:  Start: %p  End: %p   Faces:  Forward: %p  Reverse: %p\n",
    1236         [ #  # ]:          0 :     (void*)this, (void*)start_, (void*)end_, (void*)forward_.face_, (void*)reverse_.face_ );
    1237                 :          0 : }
    1238                 :            : 
    1239                 :          0 : void PST_Point::print()
    1240                 :            : {
    1241 [ #  # ][ #  # ]:          0 :   PRINT_INFO("Point %p : ( %f, %f, %f )", (void*)this , x(), y(), z() );
    1242                 :            :   
    1243         [ #  # ]:          0 :   if( edge_ )
    1244                 :            :   {
    1245 [ #  # ][ #  # ]:          0 :     PRINT_INFO("  Edges:");
    1246                 :          0 :     int count = 0;
    1247                 :          0 :     PST_Edge* edge = edge_;
    1248         [ #  # ]:          0 :     do 
    1249                 :            :     {
    1250         [ #  # ]:          0 :       if( count )
    1251                 :            :       {
    1252 [ #  # ][ #  # ]:          0 :         PRINT_INFO("\t%8p", (void*)edge);
    1253                 :            :       }
    1254                 :            :       else
    1255                 :            :       {
    1256 [ #  # ][ #  # ]:          0 :         PRINT_INFO("\n\t%8p", (void*)edge);
    1257                 :            :       }
    1258                 :            :       
    1259                 :          0 :       count = (count + 1) % 4;
    1260                 :          0 :       edge = edge->next(this);
    1261                 :            :     
    1262         [ #  # ]:          0 :     } while( edge && edge != edge_ );
    1263                 :            :     
    1264                 :            :   }
    1265 [ #  # ][ #  # ]:          0 :   PRINT_INFO("\n");
    1266                 :          0 : }
    1267                 :            : 
    1268                 :            :     
    1269                 :          0 : PST_Entity::~PST_Entity()
    1270 [ +  - ][ +  - ]:       6540 :  { }
                 [ #  # ]
    1271                 :            : 

Generated by: LCOV version 1.11