00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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 }