1 module caLib.neighbourhoods.TwoDimMargolusNeighbourhood; 2 3 import std.meta; 4 5 6 7 TwoDimMargolusNeighbourhood* create_TwoDimMargolusNeighbourhood() 8 { 9 return new TwoDimMargolusNeighbourhood(); 10 } 11 12 13 14 struct TwoDimMargolusNeighbourhood 15 { 16 17 private: 18 19 int shiftState = 1; 20 21 public: 22 23 static immutable int Dimension = 2; 24 25 int[2][] getNeighboursCoordinates(int x, int y) 26 { 27 int xOffset = (x & 1) == 0 ? 1 : -1; 28 int yOffset = (y & 1) == 0 ? 1 : -1; 29 30 int rx = x + shiftState - 1; 31 int ry = x + shiftState - 1; 32 33 return [[rx + xOffset, ry], [rx, ry + yOffset], [rx + yOffset, ry + xOffset]]; 34 } 35 36 int[2][] getBlockCoordinates(int x, int y) 37 { 38 int rx = x*2 + shiftState - 1; 39 int ry = y*2 + shiftState - 1; 40 41 return [[rx, ry], [rx+1, ry], [rx, ry+1], [rx+1, ry+1]]; 42 } 43 44 void shift() 45 { 46 shiftState = 1 - shiftState; 47 } 48 } 49 50 version(unittest) 51 { 52 import caLib_abstract.neighbourhood : isShiftingNeighbourhood; 53 } 54 55 unittest 56 { 57 static assert( isShiftingNeighbourhood!(TwoDimMargolusNeighbourhood, 2)); 58 }