2014-11-04 30 views
2

我在屏幕上有8個8個方向的遊標。如何將8個方向映射到1D數組

directions on screen

欲把它們放進陣列和他們根據方向矢量選擇。順序無關緊要,但是我需要爲1D數組中的每個向量分配i座標。我花了很長時間試圖發明它的公式,但沒有任何工作。

向量中的值可以是0,1,-1

僞代碼:

Cursor getCursor(int x, int y) { 
    int i = TheFunctionINeed(x,y); 
    return cursors[i]; 
} 

注:因爲很多人被做我想做的困惑,我以前the answer做以下小提琴:Mapping vectors to array.

+0

這是什麼意思:「我需要爲上面看到的每個矢量分配一維數組中的i座標」最終結果是什麼樣子的? – frenchie 2014-11-04 13:38:05

+0

最終結果是一個整數,它將用作數組中8個位置長的偏移量。 – 2014-11-04 13:39:16

+0

聽起來像你需要一個比數組更多的對象映射。但是我不瞭解這種關係:你傳遞[1; 0],你期望輸出什麼?或者你可能會傳遞一些東西,期望輸出是[1; 0]? 「爲每個矢量分配我在一維數組中的座標」是什麼意思? – frenchie 2014-11-04 13:40:56

回答

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) 
+0

你能解釋一下這是做什麼的嗎? – 2014-11-04 13:46:00

+0

它正在做我想做的事。對於每個向量,它返回一個數組值。 – 2014-11-04 13:48:04

+0

我認爲OP想要存儲索引而不是向量來提問問題中提到的方向,所以我們可以得到方向向量(-1,0)=> 1的映射索引,並且當給出索引像5時,方向向量將是(0,1)@OutlawLemur – dotctor 2014-11-04 13:49:21

-1

你可以任意地從一個地方如左上角開始,並命令它們順時針轉動。

所以:[-1,-1] = 0,[-1,0] = 1,等等

+0

哪些公式將映射它們? – 2014-11-04 13:48:31

+0

它可能是一個選擇語句或if語句 – thatzacdavis 2014-11-04 13:53:50

+0

但這就是問題所在。制定一個公式,映射值... – 2014-11-04 13:55:34

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? 
} 
3

要映射(X,Y)作爲一維數組人們使用通用的公式

index = x + y * (xmax + 1) 

讓我們嘗試做相同的(X,Y,Z),同時在考慮什麼都值是範圍[-1; 1](可具有樹值之一:-101)。

首先只對(X,Y),注意,你需要偏移,以避免負指數

xy = (x + 1) + (y + 1) * 3 

現在映射(XY; 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

非常感謝這個答案。我將來肯定會回到它,因爲它相當一般。 – 2014-11-04 14:19:37

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,0]'實際上對於顯示*無方向*光標非常有用。 – 2014-11-05 12:44:22