solid.cpp

Go to the documentation of this file.
00001 /**
00002  *\file         solid.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 #include "print.h"
00017 
00018 
00019 namespace euler
00020 {
00021   face_t* solid_t :: new_face()
00022   {
00023     face_t* nf = new face_t(this);
00024     if(f) f->pre = nf;
00025     f = nf;
00026 
00027     return nf;
00028   }
00029   vertex_t* solid_t :: new_vertex( point_t const& p) 
00030   {
00031     vertex_t *nv = new vertex_t(p);
00032     nv->pre = vlast;
00033 
00034     if(! vfirst) vfirst = nv;
00035 
00036     if(vlast) vlast->nxt = nv;
00037     vlast = nv;
00038 
00039     return nv;
00040   }
00041 
00042 
00043   /**
00044    * 1. add half edge (start at v1) to f1 before nxt1
00045    * 2. add half edge (start at v2) to f2 before nxt2.
00046    * 3. identify them as a pair.
00047    */
00048   std::pair<edge_t*, edge_t*> solid_t :: add_edge_pair(vertex_t* v1, edge_t* nxt1,
00049                                                        vertex_t* v2, edge_t* nxt2)
00050   {
00051     //    assert(nxt1->l->f == f1 && nxt2->l->f == f2);
00052     
00053     edge_t
00054       *nxt2_nxt = nxt2->nxt,
00055       *ne1 = new edge_t(v1, nxt1),
00056       *ne2 = new edge_t(v2, nxt2_nxt->pre);
00057 
00058     ne1->o = ne2;
00059     ne2->o = ne1;
00060     
00061     return std::make_pair(ne1, ne2);
00062   }
00063 
00064 
00065 
00066   solid_t :: ~solid_t() 
00067   { 
00068     if(solid == this) solid = nxt; 
00069     if(pre) pre->nxt = nxt;  
00070     if(nxt) nxt->pre = pre; 
00071 
00072     while(f)
00073     {
00074       face_t* temp = f;
00075       f = f->nxt;
00076       delete temp;
00077     }
00078     vertex_t *v = vfirst;
00079     while(v)
00080     {
00081       vertex_t* temp = v;
00082       v = v->nxt;
00083       delete temp;
00084     }
00085     if(id == cur_id-1) cur_id--; 
00086   }
00087 
00088 
00089   void solid_t :: del_face(face_t* face)
00090   {
00091     if(f == face) f = face->nxt; 
00092     if(face->pre) face->pre->nxt = face->nxt;  
00093     if(face->nxt) face->nxt->pre = face->pre; 
00094     delete face;
00095   }
00096 
00097   void solid_t :: del_vertex(vertex_t* vtx)
00098   {
00099     if(!vtx) return;
00100     
00101     if(vtx->pre) vtx->pre->nxt = vtx->nxt;
00102     if(vtx->nxt) vtx->nxt->pre = vtx->pre;
00103     
00104     if(vfirst == vtx)
00105     {
00106       if( !(vfirst=vtx->pre) )
00107         vfirst = vtx->nxt;
00108     }
00109     delete vtx;
00110   }
00111 
00112 
00113   void solid_t :: del_edge_pair(edge_t* e1)
00114   {
00115     edge_t* e2 = e1->o;
00116     
00117     for(edge_t *& e = e1->l->e; e == e1 || e == e2; e = e->nxt);
00118     for(edge_t *& e = e2->l->e; e == e2 || e == e2; e = e->nxt);
00119 
00120     e1->pre->nxt = e1->nxt; e1->nxt->pre = e1->pre;
00121     e2->pre->nxt = e2->nxt; e2->nxt->pre = e2->pre;
00122 
00123     delete e1; delete e2;
00124   }
00125   
00126 
00127 
00128 
00129 
00130 
00131 
00132   /**
00133    * add loops of f1 after the outer (first) loop of f2, delete f1. 
00134    * specific work to restore the validness of solid.
00135    *
00136    */
00137   void solid_t :: add_face_to(face_t* f1, face_t *f2) 
00138   { 
00139     assert(f1 != f2);
00140 
00141     for(loop_t* l=f1->l; l; l = l->nxt) 
00142     {
00143       l->f = f2;
00144     }
00145 
00146     loop_t* nxt = f2->l->nxt;
00147 
00148     f2->l->nxt = f1->l;
00149     f1->l->pre = f2->l;
00150 
00151     loop_t*last = f1->l;
00152     while(last->nxt) last = last->nxt;
00153     
00154     last->nxt = nxt;
00155     if(nxt) nxt->pre = last;
00156 
00157     f1->l = 0;
00158     del_face(f1);
00159   }
00160   
00161 
00162 
00163   solid_t& solid_t :: operator+=(vector_t const& d)
00164   {
00165     for(vertex_t *v = vfirst; v; v = v->nxt)
00166     {
00167       v->p += d;
00168     }
00169 
00170     return *this;
00171   }
00172   
00173 
00174 
00175   
00176 
00177 
00178 }//end namespace euler

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