Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <assert.h>
00029 #include <math.h>
00030 #include <string.h>
00031 #include <stdlib.h>
00032
00033 #include "amcl/map/map.h"
00034
00035
00036
00037
00038 double map_calc_range(map_t *map, double ox, double oy, double oa, double max_range)
00039 {
00040
00041 int x0,x1,y0,y1;
00042 int x,y;
00043 int xstep, ystep;
00044 char steep;
00045 int tmp;
00046 int deltax, deltay, error, deltaerr;
00047
00048 x0 = MAP_GXWX(map,ox);
00049 y0 = MAP_GYWY(map,oy);
00050
00051 x1 = MAP_GXWX(map,ox + max_range * cos(oa));
00052 y1 = MAP_GYWY(map,oy + max_range * sin(oa));
00053
00054 if(abs(y1-y0) > abs(x1-x0))
00055 steep = 1;
00056 else
00057 steep = 0;
00058
00059 if(steep)
00060 {
00061 tmp = x0;
00062 x0 = y0;
00063 y0 = tmp;
00064
00065 tmp = x1;
00066 x1 = y1;
00067 y1 = tmp;
00068 }
00069
00070 deltax = abs(x1-x0);
00071 deltay = abs(y1-y0);
00072 error = 0;
00073 deltaerr = deltay;
00074
00075 x = x0;
00076 y = y0;
00077
00078 if(x0 < x1)
00079 xstep = 1;
00080 else
00081 xstep = -1;
00082 if(y0 < y1)
00083 ystep = 1;
00084 else
00085 ystep = -1;
00086
00087 if(steep)
00088 {
00089 if(!MAP_VALID(map,y,x) || map->cells[MAP_INDEX(map,y,x)].occ_state > -1)
00090 return sqrt((x-x0)*(x-x0) + (y-y0)*(y-y0)) * map->scale;
00091 }
00092 else
00093 {
00094 if(!MAP_VALID(map,x,y) || map->cells[MAP_INDEX(map,x,y)].occ_state > -1)
00095 return sqrt((x-x0)*(x-x0) + (y-y0)*(y-y0)) * map->scale;
00096 }
00097
00098 while(x != (x1 + xstep * 1))
00099 {
00100 x += xstep;
00101 error += deltaerr;
00102 if(2*error >= deltax)
00103 {
00104 y += ystep;
00105 error -= deltax;
00106 }
00107
00108 if(steep)
00109 {
00110 if(!MAP_VALID(map,y,x) || map->cells[MAP_INDEX(map,y,x)].occ_state > -1)
00111 return sqrt((x-x0)*(x-x0) + (y-y0)*(y-y0)) * map->scale;
00112 }
00113 else
00114 {
00115 if(!MAP_VALID(map,x,y) || map->cells[MAP_INDEX(map,x,y)].occ_state > -1)
00116 return sqrt((x-x0)*(x-x0) + (y-y0)*(y-y0)) * map->scale;
00117 }
00118 }
00119 return max_range;
00120 }