Files Classes Functions Hierarchy
00001 #ifndef SIMPLEXD1LISTLINKED_H 00002 #define SIMPLEXD1LISTLINKED_H 00003 00004 00005 #include <cassert> 00006 #include <iostream> 00007 #include <sstream> 00008 #include <string> 00009 using namespace std; 00010 00011 #include <typedefs.h> 00012 #include <point.h> 00013 #include <print.h> 00014 #include <tokenizer.h> 00015 00024 template< typename VI, typename INDX > 00025 class simplexD1listlinked 00026 { 00027 public: 00028 00030 VI vi; 00031 00033 INDX length; 00034 00036 simplexD1listlinked(VI vi_, INDX length_) 00037 : vi(vi_), length(length_) {} 00038 00060 template< typename T > 00061 void readindexed( T const * beg ); 00062 00064 operator stringc () const; 00065 00067 boolc serializeInverse(stringc & s); 00068 00071 void makelinks(INDX const pointsmaxindex); 00072 00076 void consistantwinding(); 00077 }; 00078 00079 00080 //--------------------------------------------------------- 00081 // Implementation 00082 00083 00084 template< typename VI, typename INDX > 00085 void simplexD1listlinked<VI,INDX>::consistantwinding() 00086 { 00087 INDX w=1; 00088 INDX t; 00089 for (INDX i=1; i<=length; ++i) 00090 { 00091 t=vi[w].ni[0]; 00092 if (vi[t].piInverse( vi[w].pi[1] ) != 0 ) 00093 vi[t].togglelinedirection(); 00094 w = t; 00095 } 00096 } 00097 00098 template< typename VI, typename INDX > 00099 void simplexD1listlinked<VI,INDX>::makelinks(INDX const pointsmaxindex) 00100 { 00101 // Build a table of points to simplexes 00102 point2<INDX> pts[pointsmaxindex+1]; 00103 00104 INDX a; 00105 INDX b; 00106 00107 for (INDX i=0; i<length; ++i) 00108 { 00109 a = vi[i].pi[0]; 00110 b = vi[i].pi[1]; 00111 if (pts[a].x == 0) 00112 pts[a].x = i; 00113 else 00114 pts[a].y = i; 00115 if (pts[b].x == 0) 00116 pts[b].x = i; 00117 else 00118 pts[b].y = i; 00119 } 00120 00121 //cout << "Points to Simplexes table" << endl; 00122 //for (INDX k=1; k<pointsmaxindex+1; ++k) 00123 //{ 00124 // cout << k << ": " << pts[k] << endl; 00125 //} 00126 00127 INDX s1; 00128 INDX s2; 00129 INDX w; 00130 for (INDX k=1; k<pointsmaxindex+1; ++k) 00131 { 00132 s1 = pts[k].x; 00133 s2 = pts[k].y; 00134 if (s1==0) 00135 continue; 00136 if (s2==0) 00137 continue; 00138 00139 // Link the two lines. 00140 00141 w = ((vi[s2].piInverse(k))+1)%2; 00142 vi[s2].ni[ w ] = s1; 00143 00144 w = ((vi[s1].piInverse(k))+1)%2; 00145 vi[s1].ni[ w ] = s2; 00146 } 00147 } 00148 00149 template< typename VI, typename INDX > 00150 boolc simplexD1listlinked<VI,INDX>::serializeInverse(stringc & s) 00151 { 00152 tokenizer tokenstream; 00153 tokenstream.readaslinesgeneral(s); 00154 00155 INDX mylength; 00156 tokenstream.reset(); 00157 stringstream(tokenstream()) >> mylength; 00158 ++tokenstream; 00159 assert(mylength==length); 00160 if (mylength!=length) 00161 return false; 00162 00163 //cout << SHOW(s) << endl; 00164 00165 for (INDX i=0; i<length; ++i) 00166 { 00167 string z(tokenstream()); 00168 ++tokenstream; 00169 z += (" " + tokenstream()); 00170 ++tokenstream; 00171 z += (" " + tokenstream()); 00172 ++tokenstream; 00173 z += (" " + tokenstream()); 00174 ++tokenstream; 00175 //cout << SHOW(z) << endl; 00176 vi[i].serializeInverse(z); 00177 } 00178 00179 return true; 00180 } 00181 00182 template< typename VI, typename INDX > 00183 template< typename T > 00184 void simplexD1listlinked<VI,INDX>::readindexed( T const * beg ) 00185 { 00186 T const * x = beg; 00187 00188 for (INDX i=0; i<length; ++i) 00189 { 00190 vi[i].construct(*x,*(x+1)); 00191 ++x; ++x; 00192 //cout << SHOW(i) << endl; 00193 } 00194 } 00195 00196 template< typename VI, typename INDX > 00197 simplexD1listlinked<VI,INDX>::operator stringc () const 00198 { 00199 stringstream ss; 00200 ss << length << "\n"; 00201 INDX i=0; 00202 for ( ; i<length; ++i ) 00203 { 00204 ss << (string)vi[i] << "\n"; 00205 } 00206 00207 return ss.str(); 00208 } 00209 00210 00211 00212 00213 #endif 00214
1.5.8