-
Notifications
You must be signed in to change notification settings - Fork 2
/
GetNeighbours.m
144 lines (142 loc) · 7.28 KB
/
GetNeighbours.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
function [Neighbours] = GetNeighbours(DataSize, NeighboursCount)
FlatIndexes = 1:(prod(DataSize));
MaxIndex = prod(DataSize);
if numel(DataSize) == 3 && NeighboursCount == 26
Neighbours = [ ...
% left neighbour
max(FlatIndexes - 1, 1); ...
% right neighbour
min(FlatIndexes + 1, MaxIndex); ...
% upper neighbour
max(FlatIndexes - DataSize(2), 1); ...
% lower neighbour
min(FlatIndexes + DataSize(2), MaxIndex) ...
% left upper neighbour
max(FlatIndexes - 1 - DataSize(2), 1); ...
% right upper neighbour
max(FlatIndexes + 1 - DataSize(2), 1); ...
% left lower neighbour
min(FlatIndexes - 1 + DataSize(2), MaxIndex); ...
% right lower neighbour
min(FlatIndexes + 1 + DataSize(2), MaxIndex); ...
% z upper neighbour
max(FlatIndexes - DataSize(1) * DataSize(2), 1); ...
% z upper left neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) - 1, 1); ...
% z upper right neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) + 1, 1) ...
% z upper lower neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) - DataSize(2), 1); ...
% z upper upper neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) + DataSize(2), 1) ...
% z upper diag left neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) + DataSize(2) - 1, 1); ...
% z upper diag right neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) + DataSize(2) + 1, 1) ...
% z upper diag lower neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) - DataSize(2) - 1, 1); ...
% z upper diag upper neighbour
max(FlatIndexes - DataSize(1) * DataSize(2) - DataSize(2) + 1, 1) ...
% z lower neighbour
min(FlatIndexes + DataSize(1) * DataSize(2), MaxIndex); ...
% z lower left neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) - 1, MaxIndex); ...
% z lower right neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) + 1, MaxIndex) ...
% z lower lower neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) - DataSize(2), MaxIndex); ...
% z lower upper neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) + DataSize(2), MaxIndex) ...
% z lower diag left neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) + DataSize(2) - 1, MaxIndex); ...
% z lower diag right neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) + DataSize(2) + 1, MaxIndex) ...
% z lower diag lower neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) - DataSize(2) - 1, MaxIndex); ...
% z lower diag upper neighbour
min(FlatIndexes + DataSize(1) * DataSize(2) - DataSize(2) + 1, MaxIndex) ];
else
if numel(DataSize) == 3 && NeighboursCount == 6
Neighbours = [ ...
% left neighbour
max(FlatIndexes - 1, 1); ...
% right neighbour
min(FlatIndexes + 1, MaxIndex); ...
% upper neighbour
max(FlatIndexes - DataSize(2), 1); ...
% lower neighbour
min(FlatIndexes + DataSize(2), MaxIndex) ...
% z upper neighbour
max(FlatIndexes - DataSize(1) * DataSize(2), 1); ...
% z lower neighbour
min(FlatIndexes + DataSize(1) * DataSize(2), MaxIndex) ];
else
if numel(DataSize) == 2 && NeighboursCount == 4
Neighbours = [ ...
% left neighbour
max(FlatIndexes - 1, 1); ...
% right neighbour
min(FlatIndexes + 1, MaxIndex); ...
% upper neighbour
max(FlatIndexes - DataSize(2), 1); ...
% lower neighbour
min(FlatIndexes + DataSize(2), MaxIndex) ];
else
if numel(DataSize) == 2 && NeighboursCount == 8
Neighbours = [ ...
% left neighbour
max(FlatIndexes - 1, 1); ...
% right neighbour
min(FlatIndexes + 1, MaxIndex); ...
% upper neighbour
max(FlatIndexes - DataSize(2), 1); ...
% lower neighbour
min(FlatIndexes + DataSize(2), MaxIndex) ...
% left upper neighbour
max(FlatIndexes - 1 - DataSize(2), 1); ...
% right upper neighbour
max(FlatIndexes + 1 - DataSize(2), 1); ...
% left lower neighbour
min(FlatIndexes - 1 + DataSize(2), MaxIndex); ...
% right lower neighbour
min(FlatIndexes + 1 + DataSize(2), MaxIndex) ];
else
if numel(DataSize) == 2 && NeighboursCount == 16
Neighbours = [ ...
% left neighbour
max(FlatIndexes - 1, 1); ...
% right neighbour
min(FlatIndexes + 1, MaxIndex); ...
% upper neighbour
max(FlatIndexes - DataSize(2), 1); ...
% lower neighbour
min(FlatIndexes + DataSize(2), MaxIndex) ...
% left upper neighbour
max(FlatIndexes - 1 - DataSize(2), 1); ...
% right upper neighbour
max(FlatIndexes + 1 - DataSize(2), 1); ...
% left lower neighbour
min(FlatIndexes - 1 + DataSize(2), MaxIndex); ...
% right lower neighbour
min(FlatIndexes + 1 + DataSize(2), MaxIndex)
% left 2-neighbour
max(FlatIndexes - 2, 1); ...
% right 2-neighbour
min(FlatIndexes + 2, MaxIndex); ...
% upper 2-neighbour
max(FlatIndexes - 2 * DataSize(2), 1); ...
% lower 2-neighbour
min(FlatIndexes + 2 * DataSize(2), MaxIndex) ...
% left 2 upper neighbour
max(FlatIndexes - 2 - 2 * DataSize(2), 1); ...
% right 2 upper neighbour
max(FlatIndexes + 2 - 2 * DataSize(2), 1); ...
% left 2 lower neighbour
min(FlatIndexes - 2 + 2 * DataSize(2), MaxIndex); ...
% right 2 lower neighbour
min(FlatIndexes + 2 + 2 * DataSize(2), MaxIndex) ];
end
end
end
end
end