loop.cpp

Go to the documentation of this file.
00001 /**
00002  *\file         loop.cpp
00003  *
00004  *\brief        
00005  *
00006  *\author       Xianming Chen\n
00007  *              Computer Science Department\n
00008  *              University of Utah
00009  *
00010  *\date         16 Aug 2006\n
00011  *              Copyright (c) 2006, University of Utah
00012  */
00013 
00014 
00015 #include "euler.h"
00016 
00017 
00018 namespace euler
00019 {
00020 
00021   loop_t :: loop_t(face_t* f)  : f(f), e(0), pre(0), nxt(0) 
00022   { 
00023     append_to_loop_list();
00024   }
00025   loop_t :: loop_t(face_t* f, vertex_t *v)  : f(f), e(0), pre(0), nxt(0) 
00026   {
00027     append_to_loop_list();
00028     new edge_t(v, this);
00029     new edge_t(v, this->e);
00030   }
00031 
00032   loop_t :: ~loop_t()
00033   {
00034     if(! e) return;
00035     
00036     edge_t *e0 = e;
00037     do
00038     {
00039       edge_t *temp = e;
00040       e = e->nxt;
00041       delete temp;
00042     }
00043     while(e != e0);
00044   }
00045 
00046 
00047 
00048 
00049   void loop_t :: append_to_loop_list()
00050   {
00051     if(f->l) 
00052     {
00053       loop_t* lp = f->l; 
00054       for(; lp->nxt; lp = lp->nxt);
00055       lp->nxt = this;
00056       pre = lp;
00057     }
00058     else
00059       f->l = this;
00060   }
00061   
00062 
00063   void loop_t :: del_single_vertex_edge_pair()
00064   {
00065     edge_t *e1=0, *e2=0, *cur = e;
00066     do
00067     {
00068       if(! cur->o)
00069         if(! cur->nxt->o)
00070         {
00071           e1 = cur, e2 = cur->nxt;
00072           break;
00073         }
00074     }
00075     while( (cur=cur->nxt) != e );
00076     
00077     if(!e1 || !e2) return;
00078 
00079     assert(e1->v == e2->v);
00080     
00081     if(e->nxt->nxt->nxt != e)
00082     {
00083       if(e == e1 || e == e2)
00084         e = e2->nxt;
00085 
00086       e2->nxt->pre = e1->pre;
00087       e1->pre->nxt = e2->nxt;
00088 
00089       delete e1; delete e2;
00090     }
00091   }
00092 
00093   int loop_t :: total_vertices() const
00094   {
00095     int total = 0;
00096     edge_t *cur = e;
00097     do
00098     {
00099       total++;
00100     }
00101     while( (cur=cur->nxt) != e );
00102     return total;
00103   }
00104   
00105 
00106 
00107 }//end namespace euler

Generated on Wed Aug 30 16:27:58 2006 for euler by  doxygen 1.4.6