proj home

Files   Classes   Functions   Hierarchy  

simplexD1listlinked.h

Go to the documentation of this file.
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 

Generated on Fri Mar 4 00:49:31 2011 for Chelton Evans Source by  doxygen 1.5.8