Diploma Thesis Percolation Simulation C++ Sourcecode Documentation |
00001 // ndim_vector.h 00002 // class definition for a variable-dim vector 00003 // up to MAXDIM dimensions (faster than variable-dim!) 00004 // with subtraction, length, unit-, null- and randomvector 00005 // first implemented idea 1.2.2000 00006 // 00007 // VERSION 2.3 00008 // last update: 27.9.2001 00009 // Andreas Krueger 00010 00011 // #define COORDFLOAT float // for cordinates 00012 // #define REAL double // for radius, filligfactor, etc. 00013 // #define NUMBER long // for the number of clusters, etc. 00014 00015 // TODO: 00016 // 00017 // COORDFLOAT coord(int dir); 00018 // set the OUTSIDE access to coordinate from [0;...;MAXDIM-1] to [1;...;MAXDIM] 00019 // so that x=1, y=2, z=3, etc. 00020 // 00021 // it is already that way in the counting algos 00022 // using bool lower { return (u.x[dir-1] < border); } 00023 // but it is NOT in the visualization 00024 // and all other places that use COORDFLOAT coord(int dir); !!! 00025 // e.g. coordinate2boxes 00026 // e.g. ... 00027 00028 #ifndef LOADED_LITTLE_HELPERS 00029 #include "little_helpers.h" 00030 #endif 00031 00032 class myVector { 00033 int dim; // protected variable for dimensionality 00034 COORDFLOAT x[MAXDIM]; // protected vector components 00035 00036 public: 00037 myVector(); // Default-Constructor (dim=0) 00038 myVector(int setdim); // Constructor-function for definition, calls set_dim 00039 myVector(const myVector& u); // CopyConstructor 00040 00041 void set_dim(int setdim); // sets dimensionality and sets coordinates=0; 00042 friend int getdim(const myVector &u); // gives dimension 00043 00044 void randomvect (COORDFLOAT L); // (0...L)^dimension 00045 void nullvect(); // 0,0,0,...,0 (x0, x1, x2, , ... , dim-1) 00046 void unitvect(); // 0,0,0,...,0 (x0, x1, x2, , ... , dim-1) 00047 friend REAL length(const myVector &u); // vector length 00048 friend REAL squarelength(const myVector &u); // square of vector length (no SQRT!) 00049 00050 myVector& operator=(const myVector& u); // sets same dimension and copies 00051 myVector& operator-=(const myVector&); // subtraction for connection vectors 00052 friend myVector operator- (const myVector&,const myVector&); // subtraction for connection vectors 00053 friend myVector operator- (const myVector&); // (x1, x2) --> (-x1, -x2) 00054 00055 friend ostream& operator<<(ostream&, myVector&); // output operator 00056 friend istream& operator>>(istream&, myVector&); // input operator 00057 friend bool operator<(const myVector&,const myVector&); // compare operator (length order) 00058 bool operator!=(const myVector& u); // different vectors? 00059 friend bool lower(const myVector&, COORDFLOAT border,int dir); // is vector in lower (than 'border') part of this dimensional direction? 00060 00061 COORDFLOAT coord(int dir); // returns x[...]; 00062 }; 00063 00064 myVector::myVector(){ 00065 dim=0; 00066 } 00067 00068 myVector::myVector(int setdim){ 00069 if ((setdim<1)||(setdim>MAXDIM)) { 00070 errorout("'myVector' dimension < 1 or > MAXDIM"); 00071 exit(1); 00072 } 00073 else{ 00074 set_dim(setdim); 00075 } 00076 } 00077 00078 myVector::myVector(const myVector &u) { // copy constructor 00079 dim=u.dim; // create the new vector with same dimensionality 00080 for (int i=0;i<dim;i++) { // copy components 00081 x[i] = u.x[i]; 00082 } 00083 } 00084 00085 inline void myVector::set_dim(int setdim){ 00086 dim=setdim; 00087 nullvect(); 00088 } 00089 00090 int getdim(const myVector &u) { 00091 return u.dim; 00092 } 00093 00094 00095 inline REAL length(const myVector &u) { 00096 COORDFLOAT temp=0; 00097 for (int i=0;i<u.dim;i++) 00098 {temp+=u.x[i]*u.x[i];} 00099 return sqrt(temp); 00100 } 00101 00102 REAL squarelength(const myVector &u) { 00103 COORDFLOAT temp=0; 00104 for (int i=0;i<u.dim;i++) 00105 {temp+=u.x[i]*u.x[i];} 00106 return temp; 00107 } 00108 00109 ostream& operator<<(ostream& os, myVector& z) { 00110 cout <<'('; 00111 for (int i=0;i<z.dim-1;i++) { 00112 cout<<z.x[i]<<','; 00113 } 00114 return os<<z.x[z.dim-1]<<')'; 00115 } 00116 00117 istream& operator>>(istream& is, myVector& z) { 00118 for (int i=0;i<z.dim;i++) { 00119 cin>>z.x[i]; 00120 } 00121 return is; 00122 } 00123 00124 inline myVector& myVector::operator=(const myVector& u) { // give only reference for faster code 00125 if (dim!=u.dim) errorout("'=' different dimensionality"); 00126 else{ 00127 for (int i=0;i<dim;i++) { 00128 x[i] = u.x[i]; 00129 } 00130 } 00131 return *this; 00132 } 00133 00134 inline myVector& myVector::operator-=(const myVector& u) { // give only reference for faster code 00135 if (dim!=u.dim) errorout("'-=' different dimensionality"); 00136 else { 00137 for (int i=0;i<dim;i++) { 00138 x[i] -= u.x[i]; 00139 } 00140 } 00141 return *this; 00142 } 00143 00144 00145 myVector operator- (const myVector& u, const myVector& v) { 00146 if (u.dim!=v.dim) { 00147 errorout("'-' different dimensionality"); 00148 return u; 00149 } 00150 else{ 00151 myVector temp = u; 00152 return (temp -= v); // calls myVector::operator-=(myVector) 00153 } 00154 } 00155 00156 myVector operator- (const myVector& u){ 00157 myVector temp(u.dim); 00158 temp.nullvect(); 00159 return (temp-=u); 00160 } 00161 00162 inline void myVector::nullvect () { 00163 for (int i=0;i<dim;i++) { 00164 x[i] = 0; 00165 } 00166 } 00167 void myVector::unitvect() { 00168 for (int i=0;i<dim;i++) { 00169 x[i] = 1; 00170 } 00171 } 00172 00173 00174 00175 REAL short_random (REAL L) { 00176 REAL temp=rand()*L/(double)RAND_MAX; 00177 return temp; 00178 } 00179 00180 REAL long_random(REAL L){ 00181 REAL temp=rand()+rand()/(REAL)RAND_MAX; 00182 temp*=L/(REAL)RAND_MAX; 00183 return temp; 00184 } 00185 00186 00187 void myVector::randomvect (COORDFLOAT L) { 00188 for (int i=0;i<dim;i++) { 00189 x[i] = long_random(L); 00190 } 00191 } 00192 00193 00194 00195 bool operator<(const myVector &u, const myVector &v) { // length order 00196 return (length(u) < length(v) ); 00197 } 00198 00199 bool myVector::operator!=(const myVector& u) { // give only reference for faster code 00200 bool temp=0; 00201 if (u.dim!=dim) temp=1; 00202 else { 00203 for (int i=0;i<u.dim;i++) { 00204 if (x[i] != u.x[i]) temp=1; 00205 } 00206 } 00207 return temp; 00208 } 00209 00210 00211 bool lower(const myVector& u, COORDFLOAT border, int dir) { 00212 // is myVector u in lower (than 'border') part of this dimensional direction? 00213 if ((dir<1)||(dir>u.dim)) { 00214 errorout("space direction < 1 or > dim"); 00215 exit(1); 00216 return false; 00217 } 00218 else return (u.x[dir-1] < border); 00219 } 00220 00221 00222 COORDFLOAT myVector::coord(int dir) { 00223 return x[dir]; 00224 } 00225 00226 // end of class definition: myVector 00227
Diploma Thesis Sourcecode
Documentation check out the text and the executable binaries |