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

SourceForge.net Logo
Project
Download
Mailing lists

 

         

raytracer.h

00001 #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)


Generated for Orca Robotics by  doxygen 1.4.5