Skip to content

Visiting cells

Simple enumeration

By.cells iterates over all cell positions. It runs left-to-right, top-to-bottom.

import { Grids } from 'ixfx/geometry.js';
const grid = { rows: 5, cols: 5 };
for (const cell of Grids.By.cells(grid)) {
// { x, y }
}

By default it starts at { x: 0, y: 0 }, but this can be overrided, and you can also ask it to wrap from end to start to ensure all cells are visited.

// Start at 2,2 and wrap around
for (const cell of Grids.By.cells(grid, { x: 2, y: 2 }, true)) {
// { x, y }
}

You can also iterate by column or row , where you get the whole column/row as an array, rather than getting individual cell positions.

for (const col of Grid.As.columns(grid)) {
// col is an array of cell positions
}

Creating a visitor

Visit.create lets you visit cells from a position using one of several in-built logics.

LogicDescription
rowleft-to-right, top-to-bottom
columntop-to-bottom, left-to-right
neighboursneighbours surrounding cell
breadthbreadth-first
depthdepth-first
randomany random cell in grid
random-contiguousany random cell neighbouring an already visited cell

create returns a function capturing the traversal logic. This can then be used with your grid of choice.

import { Grids } from 'ixfx/geometry.js';
// Create a visitor
const visitor = Grids.Visit.create(`random-contiguous`);

The function in turn gives a generator for iterating over cell positions:

const grid = { rows: 5, cols: 5 };
for (const cell of visitor(grid)) {
// { x, y }
}

Options

create takes options for controlling behaviour when the bounds of the grid are reached, amongst others.

In summary, the options are:

boundsWrap: GridBoundsLogic;
reversed: boolean;
start: GridCell;
visited: ISetMutable<GridCell>;

Example usage:

Grids.Visit.create(`row`, {
boundsWrap: `stop`
reversed: true,
start: { x: 2, y: 10 }
})

boundsWrap is Type Grids.GridBoundsLogic . undefined is the default in most operations.

LogicDescription
unboundedCell positions allowed to go past grid row/cols
undefinedYields undefined when attempting to read outside of limits
stopYield the nearest legal position
wrapWrap around, eg go from end to start of grid

reversed runs visitor in reverse, where possible. This doesn’t do anything for the random visitors.

start specifies the starting cell. By default, { x:0, y:0 }.

visited is sometimes useful if you want to monitor which cells have been visited. If you pass in a set, the function will use this internally. The set gets created internally otherwise, but you don’t get access to it.

Stepper

Visit.stepper runs the visitor for a certain number of steps, returning the final position. The stepper remembers its position, so it becomes a way to asynchronously step through a grid in a way which is not as easy with the generator.

For example, this allows you to get the position three cells away row-wise.

// Row-wise visitor
const visitor = Grids.Visit.create(`row`);
// Create a stepper, starting at a particular position
const stepper = Grids.Visit.stepper(grid, visitor, { x: 10, y: 2 });
stepper(3); // Get {x,y} position three steps away from start position
stepper(2); // Take another two steps
stepper(4, true); // Take four steps, but reset to start position first