proj home

Files   Classes   Functions   Hierarchy  

mazematrixD2createmaze.h

Go to the documentation of this file.
00001 #ifndef MAZEMATRIXD2CREATEMAZE_H
00002 #define MAZEMATRIXD2CREATEMAZE_H
00003 
00004 #include <queue>
00005 using namespace std;
00006 
00007 #include <mazematrixD2.h>
00008 #include <point.h>
00009 #include <random.h>
00010 
00011 
00015 template< typename T >
00016 class mazematrixD2createmaze
00017 {
00018 public:
00019 
00021   mazematrixD2<T> & mz;
00022 
00024   deque< point2<T> > process;
00025 
00027   mazematrixD2createmaze(mazematrixD2<T> & mz_)
00028     : mz(mz_) {}
00029 
00031   void buildpropermaze();
00032 
00034   void impropermaze01(doublec deletewall);
00035 
00036 };
00037 
00038 
00039 //----------------------------------------------------------
00040 // Implementation
00041 
00042 
00043 template< typename T >
00044 void mazematrixD2createmaze<T>::buildpropermaze()
00045 {
00046   T m=mz.dim[0];
00047   T n=mz.dim[1];
00048 
00049   T i;
00050   T j;
00051 
00052   i=1+(rand()%(m*n));
00053 
00054   process.clear();
00055   vector< T > unvisited;
00056 
00057   mz.neighboursunvisited(unvisited,i);
00058   random_shuffle(unvisited.begin(),unvisited.end());
00059   assert(unvisited.size()!=0);
00060   process.push_back( point2<T>(i,unvisited[0]) );
00061 
00062   point2<T> current;
00063 
00064   bool res;
00065   for ( ; !process.empty(); )
00066   {
00067     current = process.front();
00068     process.pop_front();
00069 
00070     i = current.x;
00071     j = current.y;
00072 //cout << "(" << i << "," << j << ")" << endl;
00073 
00074     if (mz.vi[j].unvisited())
00075     {
00076       mz.linkadjacent(res,i,j);
00077       assert(res);
00078 
00079       mz.neighboursunvisited(unvisited,j);
00080       random_shuffle(unvisited.begin(),unvisited.end());
00081 
00082 /*
00083 cout << j << ": ";
00084 for (uint k=0; k<unvisited.size(); ++k)
00085   cout << unvisited[k] << " ";
00086 cout << endl;
00087 */
00088 
00089       //random_shuffle(unvisited.begin(),unvisited.end());
00090       if (unvisited.size()!=0)
00091       {
00092         process.push_front( point2<T>(j,unvisited[0]) );
00093         for (uint k=1; k<unvisited.size(); ++k)
00094           process.push_back( point2<T>(j,unvisited[k]) );
00095       }
00096     }
00097 
00098 /*
00099 cout << "process: ";
00100 typename deque< point2<T> >::iterator i2;
00101 i2=process.begin();
00102 for ( ; i2!=process.end(); ++i2)
00103   cout << *i2 << " ";
00104 cout << endl;
00105 */
00106 
00107   }
00108 
00109 }
00110 
00111 
00112 template< typename T >
00113 void mazematrixD2createmaze<T>::impropermaze01(doublec deletewall)
00114 {
00115   assert(deletewall<1.0);
00116   assert(deletewall >= 0.0);
00117 
00118   T m=mz.dim[0];
00119   T n=mz.dim[1];
00120   T mn=m*n;
00121 
00122   vector<T> ki(mn);
00123 
00124   for (T i=0; i<mn; ++i)
00125     ki[i]=i+1;
00126 
00127   // Help randomize things a bit, may not matter.
00128   random_shuffle(ki.begin(),ki.end());
00129 
00130   T k2;
00131   bool res;
00132  
00133   random11<> r;
00134 
00135   for (T i=0; i<mn; ++i)
00136   {
00137 
00138     for (uint j=0; j<4; ++j)
00139     {
00140       if (mz.vi[ki[i]].ni[j]!=0)
00141         continue;
00142 
00143       mz.move(res,k2,j,ki[i]);
00144       if (res==false)
00145         continue;
00146       
00147       if (r()<deletewall)
00148       {
00149         mz.linkadjacent(res,k2,ki[i]);
00150         assert(res==true);
00151       }
00152     }
00153   }
00154 }
00155 
00156 
00157 
00158 
00159 #endif
00160 
00161 

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