00001
00002
00003
00004
00005
00006
00007 #include "mesh.h"
00008
00009
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