INTRODUCTION Overview Download and Install Quick Start Documentation Publications NONFRAMEWORK CODE Driver Interfaces Drivers Libraries Utilities FRAMEWORK CODE Interfaces Components Libraries Utilities Full Software Listings DEVELOPER Tutorials Examples Dev Guide Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
raytracer.h00001 #ifndef HYDROOGMAP_RAYTRACER_H 00002 #define HYDROOGMAP_RAYTRACER_H 00003 00004 #include <hydroportability/sharedlib.h> 00005 00006 namespace hydroogmap { 00007 00016 template<class CellTracer> 00017 class SOEXPORT RayTracer 00018 { 00019 00020 public: 00021 00022 // non-const version 00023 RayTracer( CellTracer &cellTracer ) 00024 : cellTracer_(cellTracer) 00025 {} 00026 00041 bool trace( int x0, int y0, int x1, int y1 ); 00042 00043 private: 00044 00045 // These guys return: 00046 // true: we traced out to (x1,y1) 00047 // false: the trace was short-circuited 00048 // 00049 bool rayTraceOct0( int x0, int y0, int x1, int y1 ); 00050 bool rayTraceOct1( int x0, int y0, int x1, int y1 ); 00051 bool rayTraceOct2( int x0, int y0, int x1, int y1 ); 00052 bool rayTraceOct3( int x0, int y0, int x1, int y1 ); 00053 bool rayTraceOct4( int x0, int y0, int x1, int y1 ); 00054 bool rayTraceOct5( int x0, int y0, int x1, int y1 ); 00055 bool rayTraceOct6( int x0, int y0, int x1, int y1 ); 00056 bool rayTraceOct7( int x0, int y0, int x1, int y1 ); 00057 bool rayTraceOct8( int x0, int y0, int x1, int y1 ); 00058 00059 CellTracer &cellTracer_; 00060 }; 00061 00062 template<class CellTracer> 00063 SOEXPORT bool 00064 RayTracer<CellTracer>::trace( int x0, int y0, int x1, int y1 ) 00065 { 00066 /* 00067 * Octants are defined as follows: 00068 * 00069 * \2|1/ 00070 * 3\|/0 00071 * --x-- 00072 * 4/|\7 00073 * /5|6\ 00074 * 00075 */ 00076 float slope; 00077 if ( x0 == x1 ) 00078 slope = 999999; 00079 else 00080 slope = (float)(y1-y0) / (float)(x1-x0); 00081 00082 bool traceWentToEnd; 00083 if ( slope >= 0.0 && slope <= 1.0 ) 00084 { 00085 if ( x1 > x0 ) 00086 { 00087 // octant 0 00088 traceWentToEnd = rayTraceOct0( x0, y0, x1, y1 ); 00089 } 00090 else 00091 { 00092 // octant 4 00093 traceWentToEnd = rayTraceOct4( x1, y1, x0, y0 ); 00094 } 00095 } 00096 else if ( slope > 1.0 ) 00097 { 00098 if ( y1 > y0 ) 00099 { 00100 // octant 1 00101 traceWentToEnd = rayTraceOct1( x0, y0, x1, y1 ); 00102 } 00103 else 00104 { 00105 // octant 5 00106 traceWentToEnd = rayTraceOct5( x1, y1, x0, y0 ); 00107 } 00108 } 00109 else if ( slope <= -1.0 ) 00110 { 00111 if ( y1 > y0 ) 00112 { 00113 // octant 2 00114 traceWentToEnd = rayTraceOct2( x0, y0, x1, y1 ); 00115 } 00116 else 00117 { 00118 // octant 6 00119 traceWentToEnd = rayTraceOct6( x1, y1, x0, y0 ); 00120 } 00121 } 00122 else // ( slope < 0.0 && slope > -1.0 ) 00123 { 00124 if ( x1 > x0 ) 00125 { 00126 // octant 7 00127 traceWentToEnd = rayTraceOct7( x0, y0, x1, y1 ); 00128 } 00129 else 00130 { 00131 // octant 3 00132 traceWentToEnd = rayTraceOct3( x1, y1, x0, y0 ); 00133 } 00134 } 00135 00136 if ( traceWentToEnd ) 00137 { 00138 cellTracer_.traceSucceeded( x1, y1 ); 00139 } 00140 return traceWentToEnd; 00141 } 00142 00143 template<class CellTracer> 00144 SOEXPORT bool 00145 RayTracer<CellTracer>::rayTraceOct0( int x0, int y0, int x1, int y1 ) 00146 { 00147 int y = y0; 00148 int dx = 2*(x1-x0); 00149 int dy = 2*(y1-y0); 00150 int dydx = dy-dx; 00151 int F = (dy-dx)/2; 00152 00153 for (int x=x0; x<=x1; x++) 00154 { 00155 if ( !cellTracer_.traceCell( x, y ) ) 00156 { 00157 return false; 00158 } 00159 if ( F<0 ) 00160 { 00161 F += dy; 00162 } 00163 else 00164 { 00165 y++; 00166 F += dydx; 00167 } 00168 } 00169 return true; 00170 } 00171 00172 template<class CellTracer> 00173 SOEXPORT bool 00174 RayTracer<CellTracer>::rayTraceOct4( int x0, int y0, int x1, int y1 ) 00175 { 00176 int y = y1; 00177 int dx = 2*(x1-x0); 00178 int dy = 2*(y1-y0); 00179 int dydx = dy-dx; 00180 int F = (dy-dx)/2; 00181 00182 for (int x=x1; x>=x0; x--) 00183 { 00184 if ( !cellTracer_.traceCell( x, y ) ) 00185 { 00186 return false; 00187 } 00188 if ( F<0 ) 00189 { 00190 F += dy; 00191 } 00192 else 00193 { 00194 y--; 00195 F += dydx; 00196 } 00197 } 00198 return true; 00199 } 00200 00201 00202 template<class CellTracer> 00203 SOEXPORT bool 00204 RayTracer<CellTracer>::rayTraceOct1( int x0, int y0, int x1, int y1 ) 00205 { 00206 int x = x0; 00207 int dx = 2*(x1-x0); 00208 int dy = 2*(y1-y0); 00209 int dxdy = dx-dy; 00210 int F = (dx-dy)/2; 00211 00212 for (int y=y0; y<=y1; y++) 00213 { 00214 if ( !cellTracer_.traceCell( x, y ) ) 00215 { 00216 return false; 00217 } 00218 if ( F<0 ) 00219 { 00220 F += dx; 00221 } 00222 else 00223 { 00224 x++; 00225 F += dxdy; 00226 } 00227 } 00228 return true; 00229 } 00230 00231 template<class CellTracer> 00232 SOEXPORT bool 00233 RayTracer<CellTracer>::rayTraceOct5( int x0, int y0, int x1, int y1 ) 00234 { 00235 int x = x1; 00236 int dx = 2*(x1-x0); 00237 int dy = 2*(y1-y0); 00238 int dxdy = dx-dy; 00239 int F = (dx-dy)/2; 00240 00241 for (int y=y1; y>=y0; y--) 00242 { 00243 if ( !cellTracer_.traceCell( x, y ) ) 00244 { 00245 return false; 00246 } 00247 if ( F<0 ) 00248 { 00249 F += dx; 00250 } 00251 else 00252 { 00253 x--; 00254 F += dxdy; 00255 } 00256 } 00257 return true; 00258 } 00259 00260 template<class CellTracer> 00261 SOEXPORT bool 00262 RayTracer<CellTracer>::rayTraceOct2( int x0, int y0, int x1, int y1 ) 00263 { 00264 int x = x0; 00265 int dx = -2*(x1-x0); 00266 int dy = 2*(y1-y0); 00267 int dxdy = dx-dy; 00268 int F = (dx-dy)/2; 00269 00270 for (int y=y0; y<=y1; y++) 00271 { 00272 if ( !cellTracer_.traceCell( x, y ) ) 00273 { 00274 return false; 00275 } 00276 if ( F<0 ) 00277 { 00278 F += dx; 00279 } 00280 else 00281 { 00282 x--; 00283 F += dxdy; 00284 } 00285 } 00286 return true; 00287 } 00288 00289 template<class CellTracer> 00290 SOEXPORT bool 00291 RayTracer<CellTracer>::rayTraceOct6( int x0, int y0, int x1, int y1 ) 00292 { 00293 int x = x1; 00294 int dx = -2*(x1-x0); 00295 int dy = 2*(y1-y0); 00296 int dxdy = dx-dy; 00297 int F = (dx-dy)/2; 00298 00299 for (int y=y1; y>=y0; y--) 00300 { 00301 if ( !cellTracer_.traceCell( x, y ) ) 00302 { 00303 return false; 00304 } 00305 if ( F<0 ) 00306 { 00307 F += dx; 00308 } 00309 else 00310 { 00311 x++; 00312 F += dxdy; 00313 } 00314 } 00315 return true; 00316 } 00317 00318 template<class CellTracer> 00319 SOEXPORT bool 00320 RayTracer<CellTracer>::rayTraceOct7( int x0, int y0, int x1, int y1 ) 00321 { 00322 int y = y0; 00323 int dx = 2*(x1-x0); 00324 int dy = -2*(y1-y0); 00325 int dydx = dy-dx; 00326 int F = (dy-dx)/2; 00327 00328 for (int x=x0; x<=x1; x++) 00329 { 00330 if ( !cellTracer_.traceCell( x, y ) ) 00331 { 00332 return false; 00333 } 00334 if ( F<0 ) 00335 { 00336 F += dy; 00337 } 00338 else 00339 { 00340 y--; 00341 F += dydx; 00342 } 00343 } 00344 return true; 00345 } 00346 00347 template<class CellTracer> 00348 SOEXPORT bool 00349 RayTracer<CellTracer>::rayTraceOct3( int x0, int y0, int x1, int y1 ) 00350 { 00351 int y = y1; 00352 int dx = 2*(x1-x0); 00353 int dy = -2*(y1-y0); 00354 int dydx = dy-dx; 00355 int F = (dy-dx)/2; 00356 00357 for (int x=x1; x>=x0; x--) 00358 { 00359 if ( !cellTracer_.traceCell( x, y ) ) 00360 { 00361 return false; 00362 } 00363 if ( F<0 ) 00364 { 00365 F += dy; 00366 } 00367 else 00368 { 00369 y++; 00370 F += dydx; 00371 } 00372 } 00373 return true; 00374 } 00375 00376 } 00377 00378 #endif |
Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)