123 GridVisitor &visitor) {
124 const int16_t FP_SHIFT = 8;
125 const int16_t FP_ONE = 1 << FP_SHIFT;
129 int16_t startX_fp =
static_cast<int16_t
>(start.
x * FP_ONE);
130 int16_t startY_fp =
static_cast<int16_t
>(start.
y * FP_ONE);
131 int16_t endX_fp =
static_cast<int16_t
>(end.
x * FP_ONE);
132 int16_t endY_fp =
static_cast<int16_t
>(end.
y * FP_ONE);
134 int16_t x0 = startX_fp >> FP_SHIFT;
135 int16_t y0 = startY_fp >> FP_SHIFT;
136 int16_t x1 = endX_fp >> FP_SHIFT;
137 int16_t y1 = endY_fp >> FP_SHIFT;
139 int16_t stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
140 int16_t stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
142 int16_t deltaX_fp = endX_fp - startX_fp;
143 int16_t deltaY_fp = endY_fp - startY_fp;
145 uint16_t absDeltaX_fp =
146 (deltaX_fp != 0) ?
static_cast<uint16_t
>(
147 ABS((int32_t(FP_ONE) << FP_SHIFT) / deltaX_fp))
149 uint16_t absDeltaY_fp =
150 (deltaY_fp != 0) ?
static_cast<uint16_t
>(
151 ABS((int32_t(FP_ONE) << FP_SHIFT) / deltaY_fp))
154 int16_t nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
155 int16_t nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
159 ?
static_cast<uint16_t
>(
160 ABS(int32_t(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
164 ?
static_cast<uint16_t
>(
165 ABS(int32_t(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
168 const uint16_t maxT_fp = FP_ONE;
170 int16_t currentX = x0;
171 int16_t currentY = y0;
174 visitor.visit(currentX, currentY);
176 uint16_t t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
180 if (tMaxX_fp < tMaxY_fp) {
181 tMaxX_fp += absDeltaX_fp;
184 tMaxY_fp += absDeltaY_fp;
190 if (currentX != x1 || currentY != y1) {
191 visitor.visit(x1, y1);
203 GridVisitor &visitor) {
204 const int32_t FP_SHIFT = 8;
205 const int32_t FP_ONE = 1 << FP_SHIFT;
209 int32_t startX_fp =
static_cast<int32_t
>(start.
x * FP_ONE);
210 int32_t startY_fp =
static_cast<int32_t
>(start.
y * FP_ONE);
211 int32_t endX_fp =
static_cast<int32_t
>(end.
x * FP_ONE);
212 int32_t endY_fp =
static_cast<int32_t
>(end.
y * FP_ONE);
214 int32_t x0 = startX_fp >> FP_SHIFT;
215 int32_t y0 = startY_fp >> FP_SHIFT;
216 int32_t x1 = endX_fp >> FP_SHIFT;
217 int32_t y1 = endY_fp >> FP_SHIFT;
219 int32_t stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
220 int32_t stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
222 int32_t deltaX_fp = endX_fp - startX_fp;
223 int32_t deltaY_fp = endY_fp - startY_fp;
225 uint32_t absDeltaX_fp =
226 (deltaX_fp != 0) ?
static_cast<uint32_t
>(
227 ABS((int64_t(FP_ONE) << FP_SHIFT) / deltaX_fp))
229 uint32_t absDeltaY_fp =
230 (deltaY_fp != 0) ?
static_cast<uint32_t
>(
231 ABS((int64_t(FP_ONE) << FP_SHIFT) / deltaY_fp))
234 int32_t nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
235 int32_t nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
239 ?
static_cast<uint32_t
>(
240 ABS(int64_t(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
244 ?
static_cast<uint32_t
>(
245 ABS(int64_t(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
248 const uint32_t maxT_fp = FP_ONE;
250 int32_t currentX = x0;
251 int32_t currentY = y0;
254 visitor.visit(currentX, currentY);
256 uint32_t t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
260 if (tMaxX_fp < tMaxY_fp) {
261 tMaxX_fp += absDeltaX_fp;
264 tMaxY_fp += absDeltaY_fp;
269 if (currentX != x1 || currentY != y1) {
270 visitor.visit(x1, y1);