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