face.cpp

Go to the documentation of this file.
00001 /*:
00002 **     face.cpp - face
00003 **
00004 **  Copyright (C) 2004 Luiz Velho, Hélio Lopes, Esdras Medeiros.
00005 */
00006 
00007 #include "mesh.h"
00008 
00009 /* indices of 3-ring and n-ring */
00010 #define NEXT3(k)        ((k < 2)? (k+1) : 0) 
00011 #define PREV3(k)        ((k > 0)? (k-1) : 2) 
00012 
00013 
00014 using namespace Mesh;
00022 Face::Face(Surf* s, Hedge *e0, Hedge *e1, Hedge *e2)
00023 {
00024   s_ = s;
00025   reuse(e0, e1, e2);
00026 }
00036 Face* Face::reuse(Hedge *e0, Hedge *e1, Hedge *e2)
00037 {
00038   e_ = e0;
00039   e0->set_next(e1); e1->set_next(e2); e2->set_next(e0);
00040   e0->set_face(this); e1->set_face(this); e2->set_face(this);
00041   return this;
00042 }
00050 int  Face::reuse(Hedge *e, Hedge *ne)
00051 {
00052   Hedge *e0, *e1, *e2;
00053   e0 = e_;
00054   e1 = e_->next();
00055   e2 = e_->next()->next();
00056   
00057   if (e0 == e){
00058     reuse(ne, e1, e2);
00059     return 0;
00060   }
00061   if (e1 == e){
00062     reuse(e0, ne, e2); 
00063     return 1;
00064   }
00065   if (e2 == e){
00066     reuse(e0, e1, ne);
00067     return 2;
00068   }
00069 
00070   return -1;
00071 }
00072 
00078 Hedge* Face::hedge(int k)
00079 {
00080   switch (k) {
00081   case 0: return e_;
00082   case 1: return e_->next();
00083   case 2: return e_->next()->next();
00084   }
00085   throw Error("hedge index");
00086 }
00092 Vertex* Face::vertex(int k)
00093 {
00094   return hedge(PREV3(k))->org();
00095 }
00101 void  Face::set_hedge(int k, Hedge* h)
00102 {
00103   Hedge *n = hedge(NEXT3(k));
00104   Hedge *p = hedge(PREV3(k));
00105   h->set_next(n);
00106   p->set_next(h);
00107   if (k == 0) e_ = h;
00108 }
00112 void Face::link_edges()
00113 {
00114   for (int k = 0; k < 3; k++)
00115     hedge(k)->set_face(this);
00116 }
00117 

Generated on Fri Feb 24 12:23:21 2006 for TOPs by  doxygen 1.4.6-NO