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 "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 }