Get adjacent elements in a two-dimensional array? Get adjacent elements in a two-dimensional array? arrays arrays

Get adjacent elements in a two-dimensional array?


If you're not worried about the order, the cleanest is probably to use a couple of loops:

result = new List<int>(8);for (dx = -1; dx <= 1; ++dx) {    for (dy = -1; dy <= 1; ++dy) {        if (dx != 0 || dy != 0) {            result.Add(array[x + dx][y + dy]);        }    }}

If the order is important, you can construct a list of all the (dx, dy) in the order you want and iterate over that instead.

As pointed out in the comments, you probably want to add boundary checks. You could do that like this (assuming order doesn't matter):

List<int> result = new List<int>(8);for (int dx = (x > 0 ? -1 : 0); dx <= (x < max_x ? 1 : 0); ++dx){    for (int dy = (y > 0 ? -1 : 0); dy <= (y < max_y ? 1 : 0); ++dy)    {        if (dx != 0 || dy != 0)        {            result.Add(array[x + dx][y + dy]);        }    }}


I'd probably go for a constant list of dx, dy for each direction, like so:

struct {    int dx;    int dy;} directions[] = {{-1,-1,},{-1,0,},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

Then you'd iterate over the directions using a simple loop:

for (int i = 0; i < 8; i++) {    // use x + directions[i].dx;    // use y + directions[i].dy;}

You can of course use sizeof(directions) / sizeof(directions[1]) instead of the 8 above.


personally, the loops are more ugly than the original.

topLeft  = array[ x - 1 ][ y - 1 ]top      = array[ x     ][ y - 1 ]topRight = array[ x + 1 ][ y - 1 ]midLeft  = array[ x - 1 ][ y     ]midRight = array[ x + 1 ][ y     ]botLeft  = array[ x - 1 ][ y + 1 ]bot      = array[ x     ][ y + 1 ]botRight = array[ x + 1 ][ y + 1 ]

But without specifying what you want the values for - what you do in the different directions implies whether you want the values in separate variables or not.

For game of life style processing, you usually want to be working on a bitpattern anyway rather than an array of individual values, and you can scan horizontally inspecting only three of the eight cells at a time using accumulators and temporaries. For graphics convolutions, use an existing library with a 3x3 kernel.

The other way of dealing with boundaries is to expand the array by one cell in each direction. This avoids expensive branches in the convolution code.