2014-09-22 34 views
1

好的,我知道这个操作有另一个名字,但是如果我知道它,我只需在google中搜索并找到正确的算法。我希望你能理解,从下面的图我的意图:确定x/y网格索引的算法

好了,让我们假设我们有例如3x3的对象网格

... 
... 
... 

这些对象中的每个人都有指标,从0开始和结束(。) 8

012 
345 
678 

然后让使用以下循环:

w = 0; h = 0; 
go : 
w = 0; 
for(; w<grid.width; w++) 
{ 
    statuses[w][h] = isActor(CORESPONDENT_INDEX_GOES_HERE); 
    if(w == grid.width-1 && h != grid.height-1) 
    { 
     h += 1; 
     goto go; 
    } 
} 

isActor是一个返回当前对象状态的函数,它需要正确的索引。

我应该把什么,而不是CORESPONDENT_INDEX_GOES_HERE?如果我使用w*h它不起作用,我知道为什么。它不会返回正确的索引。

什么是正确的算法呢?

+0

什么是'goto go'? – 2014-09-22 08:20:35

+0

@TioPepe'goto go'怎么样?它是循环关键字'goto',将编译器重新映射到标签'go' – Edenia 2014-09-22 08:21:52

+0

当然'w * h'会导致乘以零?那么,你会为几个网格位置传递零? – Gareth 2014-09-22 08:23:34

回答

0

这表示一个多维数组。在你的情况下,它是一个3维数组。

该数组被定义为arr [3] [3]。鉴于该指数的计算方法如下:

 Column0 Column1 Column2 

Row0 0  1  2 
Row1 3  4  5 
Row2 6  7  8 

The index to access each of the values is: 

Row0 
arr[0][0] = 0 
arr[0][1] = 1 
arr[0][2] = 2 

Row1 
arr[1][0] = 3 
arr[1][1] = 4 
arr[1][2] = 5 

Row2 
arr[2][0] = 6 
arr[2][1] = 7 
arr[2][2] = 8 
+0

呵呵,是的,我知道如何通过阵列访问它们。 – Edenia 2014-09-22 08:57:21

0

我想重写代码弄成这个样子:

int gridsize = grid.width * grid.height; // be sure it doesn't overflow here 
int index; 
for (index = 0; index < gridsize; index++) 
{ 
    int w = index % grid.width; 
    int h = index/grid.width; 
    statuses[w][h] = isObject(PIXEL.name, CORESPONDENT_INDEX_GOES_HERE); 
} 

index变量可以在for循环里面C11定义:

for (int index = 0; index < gridsize; index++) 
+0

'h * grid.width + w'毕竟似乎是正确的算法。那就是我需要的。 – Edenia 2014-09-22 09:00:33

+0

@Edenia我明白了,还有其他的方法来做这个循环。不过,我认为这是比“goto”更好的方法。良好的编码风格可以节省时间。 – starrify 2014-09-22 09:01:56

+0

有一个原因,为什么我选择了'goto' 的方式,我希望尽可能减少代码,并在同一时间解析特定方向上的对象。 – Edenia 2014-09-22 09:03:46

2

正如hk6279所述,使用h * grid.width + w

这被称为“光栅扫描”。不幸的是,没有搜索“光栅”显示该公式。

+0

感谢您的信息。 – Edenia 2014-09-22 09:25:49