使用数组索引计算位置

时间:2011-11-08 01:32:44

标签: c++ arrays

我有一个代表网格的数组 grid

为了这个例子,我们将在1而不是0处启动数组,因为我在完成图片后意识到,并且无法编辑它

在此示例中,蓝色的索引为5绿色索引为23红色 38

每种颜色代表一个对象,数组索引代表对象的位置。我已经实现了非常简单的引力,如果下面的网格为空x + (WIDTH * (y + 1)),则下面的网格被此对象占用,并且该对象所在的网格变为空。

这一切都以其当前形式运行良好,但我想要做的是使红色是重力点,因此在此示例中,蓝色将移动到数组索引16然后{{ 1}}。

这不是太糟糕,但是对象如何能够动态动态移动到哪里,如绿色网格示例中所示?如何让它移动到正确的索引?

此外,迭代数组以“找到”红色位置的最佳方法是什么?我还应该注意,红色并不总是在27

有任何问题请询问,也谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

这听起来与行光栅化非常相似。想象一下网格是一个像素网格。现在,当您从绿点到红点绘制一条线时,线将通过的像素/单元格是绿点应该沿着的单元格,这应该是从绿点到红点的最短路径沿着离散的网格单元。然后,一旦遇到非空的网格单元,就会停止。

Bresenham's algorithm作为线光栅化的校本算法。

为了搜索红点,只需线性迭代数组,直到你拥有它,然后跟踪它的网格位置,就像威廉在他的回答中已经建议的那样。

答案 1 :(得分:3)

x = x位置
y = y位置
cols =网格中的列数

(y * cols) + x =任何x,y

的数组绝对值中的索引

你可以在一个函数中概括它:

int get_index(int x, int y, int gridcols)
{
    return (gridcols * y) + x;
}

应该注意的是,这适用于基于零的指数。 这假设我理解你在谈论什么......

至于第二个问题,对于你所拥有的任何有色元素,你应该在内存中保留一个值(可能存储在一个结构中)来跟踪它的位置,这样你根本不需要搜索它。 / p>

struct _THING {
   int xpos;
   int ypos;
};

使用get_index()函数,您可以通过这样调用找到它下面的网格单元格的索引:

index_below = get_index(thing.x, thing.y + 1, gridcols);
thing.y++; // increment the thing's y now since it has moved down

...简单

如果您想要反向操作,就像通过数组索引查找x,y位置一样,您可以使用模数运算符和除法。

ypos = array_index / total_cols; // division without remainder
xpos = array_index % total_cols; // gives the remainder

你可以在这样的函数中概括它:

// x and y parameters are references, and return values using these references

void get_positions_from_index(int array_index, int total_columns, int& x, int& y)
{
    y = array_index / total_columns;
    x = array_index % total_columns;
}

每当您引用数组索引时,它必须从零开始。但是,当您引用列数时,该值将基于1进行计算。 x和y位置也将基于零。

答案 2 :(得分:1)

可能最容易的是完全在(x,y)坐标系统中工作以计算重力并在最终需要查找和存储对象时切换到数组坐标。

在您的示例中,将(2,4)(红色)视为重心; (5,1)(蓝色)需要通过距离 _n_在方向(2-5,4-1)==( - 3,3)中移动。你可以决定你想要多么简单 n - 可能是你将对象移动到相邻的元素,包括对角线,所以移动(蓝色)到(5-1,1 + 1) ==(4,2)。或者也许您可以通过scalar multipleunit vector移动对象来描述您需要移动的方向。 (比如说,较重的物体会进一步移动,因为重力的吸引力会更强。或者,较轻的物体会进一步移动,因为它们的惯性要小得多。或者物体移动的距离越近,重力越好,因为重力是{{3} })。

一旦你整理了宇宙的虚拟坐标,然后通过一些简单的线性公式转换你的数字(4,2):4*columns + 2 - 或者只使用{{ 3}}和截断您的浮点结果以获取数组索引。