这里有9个元素,为了简便起见,我添加了(0, 0)。
a = {(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1)}
ZeroBasedIndex(x, y) = (x + 1) * 3 + (y + 1)
将 (x,y) 映射为 1 维数组,人们使用常见公式
index = x + y * (xmax + 1)
让我们尝试对(x,y,z)进行相同的操作,考虑到所有值都在[-1;1]范围内(可以具有三个值之一:-1
,0
或1
)。
首先仅针对(x,y),请注意,您需要进行偏移以避免负索引。
xy = (x + 1) + (y + 1) * 3
现在我们对(x,y;z)进行映射,注意 xymax
的值为 8
xyz = xy + (z + 1) * 9
index = (x + 1) + (y + 1) * 3 + (z + 1) * 9.
测试:
vector index
------------------
(-1,-1,-1) 0
(0,0,0) 13
(1,1,1) 27
我还会添加0,0以使计算更容易。
你需要的函数,我们称之为“GetCursorIndex”,可以像这样工作:
int getCursorIndex(int x, int y)
{
return (x+1)+(y+1)*3;
}
[0,0]
实际上非常有用,可以显示“无方向”光标。 - Tomáš Zato另一个选择是使用 Dictionary<Tuple<int,int>,Cursor>
。
var cursors = new Dictionary<Tuple<int,int>, Cursor>();
cursors.Add(new Tuple<int,int>(-1,-1), someCursorHere);
// continue filling it in for each vector.
Cursor getCursor(int x, int y)
{
Cursor c;
if(cursors.TryGetValue(new Tuple<int,int>(x,y), out c)
return c;
// throw an exception here or return a default value?
}
ax8 = [-1,-1,0,1,1,0,-1,1,-1]
for i in range(8):
print(ax8[i], ax8[i+1])