00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __VCG_EDGE_UPDATE_TOPOLOGY
00036 #define __VCG_EDGE_UPDATE_TOPOLOGY
00037 #include <algorithm>
00038 namespace vcg {
00039 namespace edge {
00042
00043 template <class UpdateMeshType>
00044 class UpdateTopology
00045 {
00046
00047 public:
00048 typedef UpdateMeshType MeshType;
00049 typedef typename MeshType::VertexType VertexType;
00050 typedef typename MeshType::VertexPointer VertexPointer;
00051 typedef typename MeshType::VertexIterator VertexIterator;
00052 typedef typename MeshType::EdgeType EdgeType;
00053 typedef typename MeshType::EdgePointer EdgePointer;
00054 typedef typename MeshType::EdgeIterator EdgeIterator;
00055
00056
00057
00059
00060 class PVertex
00061 {
00062 public:
00063
00064 VertexPointer v;
00065 EdgePointer e;
00066 int z;
00067
00068 PVertex() {}
00069
00070 void Set( EdgePointer pe, const int nz )
00071 {
00072 assert(pe!=0);
00073 assert(nz>=0);
00074 assert(nz<2);
00075
00076 v= pe->V(nz);
00077 e = pe;
00078 z = nz;
00079 }
00080
00081 inline bool operator < ( const PVertex & pe ) const
00082 {
00083 return ( v<pe.v );
00084 }
00085
00086 inline bool operator <= ( const PVertex & pe ) const
00087 {
00088 return ( v<=pe.v );
00089 }
00090
00091 inline bool operator > ( const PVertex & pe ) const
00092 {
00093 return ( v>pe.v );
00094 }
00095
00096 inline bool operator >= ( const PVertex & pe ) const
00097 {
00098 return( v>pe.v );
00099 }
00100
00101 inline bool operator == ( const PVertex & pe ) const
00102 {
00103 return (v==pe.v);
00104 }
00105
00106 inline bool operator != ( const PVertex & pe ) const
00107 {
00108 return (v!=pe.v || v!=pe.v);
00109 }
00110 };
00111
00112
00113
00114 static void EdgeEdge(MeshType &m)
00115 {
00116 if(!m.HasEETopology()) return;
00117
00118 vector<PVertex> v;
00119 EdgeIterator pf;
00120 typename vector<PVertex>::iterator p;
00121
00122 if( m.en == 0 ) return;
00123
00124 v.resize(m.en*2);
00125 p = v.begin();
00126 for(pf=m.edges.begin();pf!=m.edges.end();++pf)
00127 if( ! (*pf).IsD() )
00128 for(int j=0;j<2;++j)
00129 {
00130 (*p).Set(&(*pf),j);
00131 ++p;
00132 }
00133 assert(p==v.end());
00134 sort(v.begin(), v.end());
00135
00136 int ne = 0;
00137
00138 typename vector<PVertex>::iterator pe,ps;
00139 for(ps = v.begin(),pe=v.begin();pe<=v.end();++pe)
00140 {
00141 if( pe==v.end() || *pe != *ps )
00142 {
00143 typename vector<PVertex>::iterator q,q_next;
00144 for (q=ps;q<pe-1;++q)
00145 {
00146 assert((*q).z>=0);
00147 assert((*q).z< 2);
00148 q_next = q;
00149 ++q_next;
00150 assert((*q_next).z>=0);
00151 assert((*q_next).z< 2);
00152 (*q).e->EEp(q->z) = (*q_next).e;
00153 (*q).e->EEi(q->z) = (*q_next).z;
00154 }
00155 assert((*q).z>=0);
00156 assert((*q).z< 3);
00157 (*q).e->EEp((*q).z) = ps->e;
00158 (*q).e->EEi((*q).z) = ps->z;
00159 ps = pe;
00160 ++ne;
00161 }
00162 }
00163 }
00164
00165 static void VertexEdge(MeshType &m)
00166 {
00167 if(!m.HasVETopology()) return;
00168
00169 VertexIterator vi;
00170 EdgeIterator ei;
00171
00172 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
00173 {
00174 (*vi).Ep() = 0;
00175 (*vi).Ei() = 0;
00176 }
00177
00178 for(ei=m.edges.begin();ei!=m.edges.end();++ei)
00179 if( ! (*ei).IsD() )
00180 {
00181 for(int j=0;j<2;++j)
00182 {
00183 (*ei).Ev(j) = (*ei).V(j)->Ep();
00184 (*ei).Zv(j) = (*ei).V(j)->Ei();
00185 (*ei).V(j)->Ep() = &(*ei);
00186 (*ei).V(j)->Ei() = j;
00187 }
00188 }
00189 }
00190
00191
00192 };
00193
00195 }
00196 }
00197
00198
00199 #endif