Search code examples
algorithmsearchgridradial

Radial Grid Search Algorithm


I'm sure there's a clean way to do this, but I'm probably not using the right keywords for find it.

So let's say I have a grid. Starting from a position on the grid, return all of the grid coordinates that fall within a given distance. So I call something like:

getCoordinates( currentPosition, distance )

And for each coordinate, starting from the initial position, add all cardinal directions, and then add the spaces around those and so forth until the distance is reached. I imagine that on a grid this would look like a diamond. The function would return that array of coordinates. Can someone point me to a routine that will do this efficiently ( I'm working in AS3, for what it's worth )?

In the desired output, iteration 1 would be:

.x.
xxx
.x.

Iteration 2 would be:

..x..
.xxx.
xxxxx
.xxx.
..x..

Iteration 3:

...x...
..xxx..
.xxxxx.
xxxxxxx
.xxxxx.
..xxx..
...x...

and so on...


Solution

  • Edit: Updated the algorithm to reflect what the OP wanted.

    Iteration 1:

    .x.
    xxx
    .x.
    

    Iteration 2:

    ..x..
    .xxx.
    xxxxx
    .xxx.
    ..x..
    

    ... Iteration 4:

    ....x....
    ...xxx...
    ..xxxxx..
    .xxxxxxx.
    xxxxxxxxx
    .xxxxxxx.
    ..xxxxx..
    ...xxx...
    ....x....
    

    Clearly, you can determine the coordinates without iterating.

    If the starting point is (X, Y), and the iteration is n

    for(int i = x - n; i <= x + n; i++)
    {
        for(int j = y - n; j <= y + n; j++)
        {
            int dx = abs(i - x);
            int dy = abs(j - y);
            if(dx + dy <= n) //Produces a diamond, n+1 would produce a diamond with cut corners
            {
                //The point at (i, j) is within the marked area.
            }
        }
    }