如何将8个方向映射到一维数组

3
我在屏幕上有8个指针,分别指向8个方向。
我想将它们放入数组中,并根据方向向量选择它们。顺序不重要,但我需要为上面每个向量分配1D数组中的 i 坐标。我花了很长时间试图发明这个公式,但是没有什么效果。
向量中的值可以是0,1,-1
伪代码:
Cursor getCursor(int x, int y) {
    int i = TheFunctionINeed(x,y);
    return cursors[i];
}

注意:由于很多人对我想要什么感到困惑,我使用了该答案来制作下面的fiddle:将向量映射到数组。


什么意思:“我需要为上面看到的每个向量分配1D数组中的i坐标”?最终结果会是什么样子? - frenchie
最终结果是一个整数,将用作长度为8的数组的偏移量。 - Tomáš Zato
听起来你需要一个对象映射而不是数组。但我不理解关系:你传入[1;0],你期望什么输出?或者你传入某些东西并期望输出为[1;0]?"为每个向量分配1D数组中的i坐标"是什么意思? - frenchie
你是说如果光标向屏幕右上方移动,你想输出[1,-1]吗? - Liam McInroy
是的,这里涉及到数学,但那不是难点。您想要跟踪光标移动的方向,并根据此确定输出[1;-1],如果光标朝右上角移动? - frenchie
显示剩余2条评论
6个回答

5

这里有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)

你能解释一下这段代码在做什么吗? - Liam McInroy
它正在做我想要的事情。对于每个向量,它返回一个数组值。 - Tomáš Zato
我认为OP想要存储索引而不是向量,以便于获取方向向量的映射索引(-1,0)=> 1,当给出索引5时,方向向量将是(0,1)。@OutlawLemur - Hamid Pourjam

3

将 (x,y) 映射为 1 维数组,人们使用常见公式

index = x + y * (xmax + 1)

让我们尝试对(x,y,z)进行相同的操作,考虑到所有值都在[-1;1]范围内(可以具有三个值之一:-101)。

首先仅针对(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

非常感谢您的回答。这个回答非常通用,我将来一定会再回来查看。 - Tomáš Zato

2

我还会添加0,0以使计算更容易。

你需要的函数,我们称之为“GetCursorIndex”,可以像这样工作:

int getCursorIndex(int x, int y)
{
    return (x+1)+(y+1)*3;
}

如果您已经将光标排序,使得第一个表示为-1,-1,最后一个表示为1,1,那么您可以在数组的中心位置添加一个表示为-1,0或1,0的光标,两次...或者您可以创建一个表示为0,0的光标...也许这是有意义的。

是的,最后,[0,0]实际上非常有用,可以显示“无方向”光标。 - Tomáš Zato

1

另一个选择是使用 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?
}

0
我有一个最简单的方法来映射这个。只需像这样定义你的数组
ax8 = [-1,-1,0,1,1,0,-1,1,-1]

现在循环直到8,它将给出所有的点。
for i in range(8):
    print(ax8[i], ax8[i+1])

希望这能帮到你!

-1
你可以任意选择一个位置,比如左上角开始,按顺时针的方向依次排序。
所以:[-1,-1] = 0,[-1,0] = 1,依此类推。

它们之间的映射公式在哪里? - Tomáš Zato
它可以是一个select语句或一个if语句。 - thatzacdavis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接