FastLED 3.9.15
Loading...
Searching...
No Matches

◆ traverseGridSegment32()

template<typename GridVisitor>
void fl::traverseGridSegment32 ( const vec2f & start,
const vec2f & end,
GridVisitor & visitor )
inline
Template Parameters
GridVisitor
Parameters
startstart point
endend point
visitorcalled for each cell visited.

UNTESTED!!!!

Definition at line 202 of file traverse_grid.h.

203 {
204 const int32_t FP_SHIFT = 8;
205 const int32_t FP_ONE = 1 << FP_SHIFT;
206 // const int32_t FP_MASK = FP_ONE - 1;
207
208 // Convert to fixed-point (Q24.8) signed
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);
213
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;
218
219 int32_t stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
220 int32_t stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
221
222 int32_t deltaX_fp = endX_fp - startX_fp;
223 int32_t deltaY_fp = endY_fp - startY_fp;
224
225 uint32_t absDeltaX_fp =
226 (deltaX_fp != 0) ? static_cast<uint32_t>(
227 ABS((int64_t(FP_ONE) << FP_SHIFT) / deltaX_fp))
228 : UINT32_MAX;
229 uint32_t absDeltaY_fp =
230 (deltaY_fp != 0) ? static_cast<uint32_t>(
231 ABS((int64_t(FP_ONE) << FP_SHIFT) / deltaY_fp))
232 : UINT32_MAX;
233
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);
236
237 uint32_t tMaxX_fp =
238 (deltaX_fp != 0)
239 ? static_cast<uint32_t>(
240 ABS(int64_t(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
241 : UINT32_MAX;
242 uint32_t tMaxY_fp =
243 (deltaY_fp != 0)
244 ? static_cast<uint32_t>(
245 ABS(int64_t(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
246 : UINT32_MAX;
247
248 const uint32_t maxT_fp = FP_ONE;
249
250 int32_t currentX = x0;
251 int32_t currentY = y0;
252
253 while (true) {
254 visitor.visit(currentX, currentY);
255
256 uint32_t t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
257 if (t_fp > maxT_fp)
258 break;
259
260 if (tMaxX_fp < tMaxY_fp) {
261 tMaxX_fp += absDeltaX_fp;
262 currentX += stepX;
263 } else {
264 tMaxY_fp += absDeltaY_fp;
265 currentY += stepY;
266 }
267 }
268
269 if (currentX != x1 || currentY != y1) {
270 visitor.visit(x1, y1);
271 }
272}
#define ABS(x)
Definition math_macros.h:19

References ABS, fl::vec2< T >::x, and fl::vec2< T >::y.

Referenced by traverseGridSegment().

+ Here is the caller graph for this function: