src
navtest
navwin.cpp
Go to the documentation of this file.
1
//
2
// simple timing test of the nav fn planner
3
//
4
5
#include <string.h>
6
#include "
navwin.h
"
7
8
namespace
navfn
{
9
NavWin::NavWin
(
int
w,
int
h,
const
char
*name)
10
: Fl_Double_Window(w,h,name)
11
{
12
nw
= w;
13
nh
= h;
14
dec
= 1;
15
maxval
= 90*1000;
16
im
= NULL;
17
pw
= w;
18
ph
= h;
19
pce
=
pne
=
poe
= 0;
20
pc
=
pn
=
po
= NULL;
21
pathlen
=
pathbuflen
= 0;
22
path
= NULL;
23
}
24
25
NavWin::~NavWin
()
26
{
27
}
28
29
void
30
NavWin::drawPot
(
NavFn
*nav)
31
{
32
float
*pot = nav->
potarr
;
33
COSTTYPE
*cst = nav->
costarr
;
34
int
width = nav->
nx
;
35
int
height = nav->
ny
;
36
37
// params
38
pw
= width;
39
ph
= height;
40
41
// figure out decimation or expansion to fit
42
dec
= 1;
43
inc
= 1;
44
45
if
(width >=
nw
/2)
46
{
47
int
ww = width;
48
while
(ww >
nw
)
49
{
50
dec
++;
51
ww = width/
dec
;
52
}
53
54
int
hh = height/
dec
;
55
while
(hh >
nh
)
56
{
57
dec
++;
58
hh = height/
dec
;
59
}
60
61
if
(
im
== NULL)
62
im
=
new
uchar[
nw
*
nh
*3];
63
64
65
// draw potential
66
for
(
int
i=0; i<height-
dec
+1; i+=
dec
)
67
{
68
float
*pp = pot + i*width;
69
uchar *ii =
im
+ 3*i/
dec
*
nw
;
70
for
(
int
j=0; j<width-
dec
+1; j+=
dec
, pp+=
dec
)
71
{
72
int
v;
73
v = (int)((*pp/
maxval
) * 255.0);
74
*ii++ = v;
75
*ii++ = v;
76
*ii++ = v;
77
}
78
}
79
80
81
// draw obstacles
82
for
(
int
i=0; i<height-
dec
+1; i+=
dec
)
83
{
84
COSTTYPE
*pp = cst + i*width;
85
uchar *ii =
im
+ 3*i/
dec
*
nw
;
86
for
(
int
j=0; j<width-
dec
+1; j+=
dec
, pp+=
dec
, ii+=3)
87
{
88
if
(*pp >=
COST_OBS
)
89
{
90
*ii = 120;
91
*(ii+1) = 60;
92
*(ii+2) = 60;
93
}
94
}
95
}
96
97
}
98
99
else
// expand
100
{
101
int
ww = width;
102
while
(ww <
nw
/2)
103
{
104
inc
++;
105
ww = width*
inc
;
106
}
107
108
int
hh = height*
inc
;
109
while
(hh <
nh
/2)
110
{
111
inc
++;
112
hh = height*
inc
;
113
}
114
115
if
(
im
== NULL)
116
im
=
new
uchar[
nw
*
nh
*3];
117
118
for
(
int
i=0; i<height; i++)
119
{
120
float
*pp = pot + i*width;
121
uchar *ii =
im
+ 3*i*
inc
*
nw
;
122
for
(
int
j=0; j<width; j++, pp++)
123
{
124
int
v;
125
if
(*pp >
maxval
)
126
v = 255;
127
else
128
v = (int)((*pp/
maxval
) * 255.0);
129
for
(
int
k=0; k<
inc
; k++)
130
{
131
uchar *iii = ii + 3*j*
inc
+ 3*k*
nw
;
132
for
(
int
kk=0; kk<
inc
; kk++)
133
{
134
*iii++ = v;
135
*iii++ = v;
136
*iii++ = v;
137
}
138
}
139
}
140
}
141
}
142
143
144
make_current();
145
fl_draw_image(
im
, 0,0,
nw
,
nh
);
146
147
if
(
pc
)
148
delete
[]
pc
;
149
pce
= nav->
curPe
;
150
pc
=
new
int
[
pce
];
151
memcpy(
pc
, nav->
curP
,
pce
*
sizeof
(
int
));
152
153
if
(
pn
)
154
delete
[]
pn
;
155
pne
= nav->
nextPe
;
156
pn
=
new
int
[
pne
];
157
memcpy(
pn
, nav->
nextP
,
pne
*
sizeof
(
int
));
158
159
if
(
po
)
160
delete
[]
po
;
161
poe
= nav->
overPe
;
162
po
=
new
int
[
poe
];
163
memcpy(
po
, nav->
overP
,
poe
*
sizeof
(
int
));
164
165
// start and goal
166
goal
[0] = nav->
goal
[0];
167
goal
[1] = nav->
goal
[1];
168
start
[0] = nav->
start
[0];
169
start
[1] = nav->
start
[1];
170
171
// path
172
if
(nav->
npath
> 0)
173
{
174
pathlen
= nav->
npath
;
175
if
(
pathbuflen
<
pathlen
)
176
{
177
pathbuflen
=
pathlen
;
178
if
(
path
)
delete
[]
path
;
179
path
=
new
int
[
pathbuflen
];
180
}
181
for
(
int
i=0; i<
pathlen
; i++)
182
path
[i] = width*(
int
)(nav->
pathy
[i])+(
int
)(nav->
pathx
[i]);
183
}
184
185
drawOverlay
();
186
187
redraw();
188
}
189
190
191
void
192
NavWin::drawOverlay
()
193
{
194
if
(
inc
== 1)
// decimation
195
{
196
fl_color(255,0,0);
197
if
(
pce
> 0)
198
for
(
int
i=0; i<
pce
; i++)
199
{
200
int
y =
pc
[i]/
pw
;
201
int
x =
pc
[i]%
pw
;
202
fl_point(x/
dec
,y/
dec
);
203
}
204
fl_color(255,0,0);
205
if
(
pne
> 0)
206
for
(
int
i=0; i<
pne
; i++)
207
{
208
int
y =
pn
[i]/
pw
;
209
int
x =
pn
[i]%
pw
;
210
fl_point(x/
dec
,y/
dec
);
211
}
212
fl_color(0,255,0);
213
if
(
poe
> 0)
214
for
(
int
i=0; i<
poe
; i++)
215
{
216
int
y =
po
[i]/
pw
;
217
int
x =
po
[i]%
pw
;
218
fl_point(x/
dec
,y/
dec
);
219
}
220
}
221
else
// expansion
222
{
223
fl_color(255,0,0);
224
if
(
pce
> 0)
225
for
(
int
i=0; i<
pce
; i++)
226
{
227
int
y =
pc
[i]/
pw
;
228
int
x =
pc
[i]%
pw
;
229
fl_rect(x*
inc
,y*
inc
,
inc
,
inc
);
230
}
231
fl_color(255,0,0);
232
if
(
pne
> 0)
233
for
(
int
i=0; i<
pne
; i++)
234
{
235
int
y =
pn
[i]/
pw
;
236
int
x =
pn
[i]%
pw
;
237
fl_rect(x*
inc
,y*
inc
,
inc
,
inc
);
238
}
239
fl_color(0,255,0);
240
if
(
poe
> 0)
241
for
(
int
i=0; i<
poe
; i++)
242
{
243
int
y =
po
[i]/
pw
;
244
int
x =
po
[i]%
pw
;
245
fl_rect(x*
inc
,y*
inc
,
inc
,
inc
);
246
}
247
}
248
249
// draw the goal
250
fl_color(255,200,0);
251
int
x =
goal
[0];
252
int
y =
goal
[1];
253
if
(
inc
== 1)
254
fl_rectf(x/
dec
-2,y/
dec
-2,5,5);
255
else
256
fl_rectf(x*
inc
-2,y*
inc
-2,5,5);
257
258
// draw the start
259
fl_color(0,255,0);
260
x =
start
[0];
261
y =
start
[1];
262
if
(
inc
== 1)
263
fl_rectf(x/
dec
-2,y/
dec
-2,5,5);
264
else
265
fl_rectf(x*
inc
-2,y*
inc
-2,5,5);
266
267
// draw the path
268
fl_color(0,255,255);
269
if
(
inc
== 1 &&
pathlen
> 0)
// decimation or equal pixels
270
{
271
int
y =
path
[0]/
pw
;
272
int
x =
path
[0]%
pw
;
273
for
(
int
i=1; i<
pathlen
; i++)
274
{
275
int
y1 =
path
[i]/
pw
;
276
int
x1 =
path
[i]%
pw
;
277
fl_line(x/
dec
,y/
dec
,x1/
dec
,y1/
dec
);
278
x = x1;
279
y = y1;
280
}
281
}
282
}
283
284
285
void
NavWin::draw
()
286
{
287
if
(
im
)
288
fl_draw_image(
im
, 0,0,
nw
,
nh
);
289
drawOverlay
();
290
}
291
};
292
navfn::NavWin::im
uchar * im
Definition:
navwin.h:34
navfn::NavWin::pc
int * pc
Definition:
navwin.h:35
navfn::NavWin::nw
int nw
Definition:
navwin.h:25
navfn::NavWin::pathbuflen
int pathbuflen
Definition:
navwin.h:41
navfn::NavWin::~NavWin
~NavWin()
Definition:
navwin.cpp:25
navfn::NavWin::inc
int inc
Definition:
navwin.h:27
navfn::NavWin::pathlen
int pathlen
Definition:
navwin.h:40
navfn::NavWin::maxval
float maxval
Definition:
navwin.h:29
navfn::NavWin::drawOverlay
void drawOverlay()
Definition:
navwin.cpp:192
navfn::NavFn::npath
int npath
Definition:
navfn.h:239
navfn::NavFn
Navigation function class. Holds buffers for costmap, navfn map. Maps are pixel-based....
Definition:
navfn.h:106
COST_OBS
#define COST_OBS
Definition:
navfn.h:51
navfn::NavFn::goal
int goal[2]
Definition:
navfn.h:197
navfn::NavFn::overP
int * overP
Definition:
navfn.h:177
navfn
Definition:
navfn.h:81
navfn::NavFn::curPe
int curPe
Definition:
navfn.h:178
navfn::NavWin::dec
int dec
Definition:
navwin.h:27
COSTTYPE
#define COSTTYPE
Definition:
navfn.h:71
navfn::NavFn::overPe
int overPe
Definition:
navfn.h:178
navfn::NavFn::nextP
int * nextP
Definition:
navfn.h:177
navfn::NavWin::pw
int pw
Definition:
navwin.h:26
navfn::NavFn::nextPe
int nextPe
Definition:
navfn.h:178
navfn::NavWin::path
int * path
Definition:
navwin.h:39
navfn::NavWin::pce
int pce
Definition:
navwin.h:36
navfn::NavWin::po
int * po
Definition:
navwin.h:35
navfn::NavFn::potarr
float * potarr
Definition:
navfn.h:171
navfn::NavWin::pne
int pne
Definition:
navwin.h:36
navfn::NavFn::start
int start[2]
Definition:
navfn.h:198
navfn::NavWin::ph
int ph
Definition:
navwin.h:26
navfn::NavWin::start
int start[2]
Definition:
navwin.h:38
navfn::NavWin::poe
int poe
Definition:
navwin.h:36
navfn::NavWin::drawPot
void drawPot(NavFn *nav)
Definition:
navwin.cpp:30
navfn::NavWin::draw
void draw()
Definition:
navwin.cpp:285
navfn::NavFn::pathx
float * pathx
Definition:
navfn.h:238
navfn::NavFn::pathy
float * pathy
Definition:
navfn.h:238
navwin.h
navfn::NavFn::nx
int nx
Definition:
navfn.h:124
navfn::NavWin::nh
int nh
Definition:
navwin.h:25
navfn::NavFn::ny
int ny
Definition:
navfn.h:124
navfn::NavFn::curP
int * curP
Definition:
navfn.h:177
navfn::NavFn::costarr
COSTTYPE * costarr
Definition:
navfn.h:170
navfn::NavWin::NavWin
NavWin(int w, int h, const char *name)
Definition:
navwin.cpp:9
navfn::NavWin::goal
int goal[2]
Definition:
navwin.h:37
navfn::NavWin::pn
int * pn
Definition:
navwin.h:35
navfn
Author(s): Kurt Konolige, Eitan Marder-Eppstein, contradict@gmail.com
autogenerated on Mon Mar 6 2023 03:50:37