36 #ifndef NAV2_UTIL__RAYTRACE_LINE_2D_HPP_
37 #define NAV2_UTIL__RAYTRACE_LINE_2D_HPP_
49 inline int sign(
int x)
51 return x > 0 ? 1 : -1;
58 template<
class ActionType>
59 inline void bresenham2D(
60 ActionType at,
unsigned int abs_da,
unsigned int abs_db,
int error_b,
61 int offset_a,
int offset_b,
unsigned int offset,
62 unsigned int max_length)
64 unsigned int end = std::min(max_length, abs_da);
65 for (
unsigned int i = 0; i < end; ++i) {
69 if ((
unsigned int)error_b >= abs_da) {
89 template<
class ActionType>
90 inline void raytraceLine(
91 ActionType at,
unsigned int x0,
unsigned int y0,
unsigned int x1,
92 unsigned int y1,
unsigned int step_x,
93 unsigned int max_length = UINT_MAX,
unsigned int min_length = 0)
95 int dx_full = x1 - x0;
96 int dy_full = y1 - y0;
100 double dist = std::hypot(dx_full, dy_full);
101 if (dist < min_length) {
105 unsigned int min_x0, min_y0;
108 min_x0 = (
unsigned int)(x0 + dx_full / dist * min_length);
109 min_y0 = (
unsigned int)(y0 + dy_full / dist * min_length);
116 unsigned int offset = min_y0 * step_x + min_x0;
118 int dx = x1 - min_x0;
119 int dy = y1 - min_y0;
121 unsigned int abs_dx = abs(dx);
122 unsigned int abs_dy = abs(dy);
124 int offset_dx = sign(dx);
125 int offset_dy = sign(dy) * step_x;
127 double scale = (dist == 0.0) ? 1.0 : std::min(1.0, max_length / dist);
129 if (abs_dx >= abs_dy) {
130 int error_y = abs_dx / 2;
133 at, abs_dx, abs_dy, error_y, offset_dx, offset_dy, offset, (
unsigned int)(scale * abs_dx));
138 int error_x = abs_dy / 2;
141 at, abs_dy, abs_dx, error_x, offset_dy, offset_dx, offset, (
unsigned int)(scale * abs_dy));