以角度遍历2D阵列

时间:2011-07-12 08:59:40

标签: algorithm math geometry

通常我们按行或列遍历数组,但在这里我想以一个角度遍历它。 我会试着解释一下我的意思, 因此,如果角度为45度,而不是逐行,它将搜索为(0,0)然后(0,1)(1,0)然后(0,2),(1,1),(2) ,0)等等..(抱歉无法上传图片,因为我是新用户而且不允许这样做,可能会尝试想象/绘制一个有助于得到我想说的数组的数组) 但是如果用户输入20度的角度会发生什么,我们如何确定如何搜索阵列。

我只是想知道是否有任何算法可以做类似的事情?编程语言不是问题我想这个问题更多的是algoritham排序。 任何想法都会受到欢迎。 如果我无法清楚地解释我在寻找什么,请随时询问。

谢谢你们。

3 个答案:

答案 0 :(得分:6)

易。采取一个角度(让我们说45)。这对应于您的案例中的向量v=(1, 1)。 (这可以归一化为单一向量(sqrt(2)/2, sqrt(2)/2),但这不是必需的)

对于数组中的每个点,您的坐标为(x, y)。只需使用向量执行这些坐标的标量积。我们打电话给f(x, y) = scalarProduct((x, y), v)

f(x, y)的值进行排序,您就可以找到“遍历”了!


一个真实的例子。 你的矩阵是3x3 标量产品是:

(0,0)。(1,1)= 0

(0,1)。(1,1)= 1

(0,2)。(1,1)= 2

(1,0)。(1,1)= 1

(1,1)。(1,1)= 2

(1,2)。(1,1)= 3

(2,0)。(1,1)= 2

(2,1)。(1,1)= 3

(2,2)。(1,1)= 4

如果您按升序订购这些标量产品,您将获得订购(0,0),(1,0),(1,0),(2,0),(1,1),(0, 2),(2,1)......


如果你想用角度20做,用v=(1, 1)替换v=(cos(20), sin(20))的所有出现


以下是几何解释的图示。标量积对应于矢量v(红色)与蓝线的交点。

Illustration

答案 1 :(得分:1)

对于每个起点(每行的最左边的点),使用三角法确定给定角度的终点。 tan(角度)定义为(数组的高度差/宽度),因此您的高度差异为tan(角度)*(数组的大小)。您只需计算一次高度差。如果y +高度差大于数组的高度,则只需减去高度(或使用模运算符)。

现在您有一个起点和终点,您可以使用Bresenham的算法来确定两者之间的点:http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

答案 2 :(得分:0)

您想要寻找空间填充曲线,例如莫顿曲线或z曲线。如果要将数组细分为4个图块,可能需要查找希尔伯特曲线或摩尔曲线。