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 }