通常我们按行或列遍历数组,但在这里我想以一个角度遍历它。 我会试着解释一下我的意思, 因此,如果角度为45度,而不是逐行,它将搜索为(0,0)然后(0,1)(1,0)然后(0,2),(1,1),(2) ,0)等等..(抱歉无法上传图片,因为我是新用户而且不允许这样做,可能会尝试想象/绘制一个有助于得到我想说的数组的数组) 但是如果用户输入20度的角度会发生什么,我们如何确定如何搜索阵列。
我只是想知道是否有任何算法可以做类似的事情?编程语言不是问题我想这个问题更多的是algoritham排序。 任何想法都会受到欢迎。 如果我无法清楚地解释我在寻找什么,请随时询问。
谢谢你们。
答案 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(红色)与蓝线的交点。
答案 1 :(得分:1)
对于每个起点(每行的最左边的点),使用三角法确定给定角度的终点。 tan(角度)定义为(数组的高度差/宽度),因此您的高度差异为tan(角度)*(数组的大小)。您只需计算一次高度差。如果y +高度差大于数组的高度,则只需减去高度(或使用模运算符)。
现在您有一个起点和终点,您可以使用Bresenham的算法来确定两者之间的点:http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
答案 2 :(得分:0)
您想要寻找空间填充曲线,例如莫顿曲线或z曲线。如果要将数组细分为4个图块,可能需要查找希尔伯特曲线或摩尔曲线。