【问题标题】:Traversing a 2D array in an angle以一定角度遍历二维数组
【发布时间】:2011-07-12 08:59:40
【问题描述】:

一般我们按行或按列遍历数组,但这里我想以一个角度遍历它。 我会试着解释我的意思, 所以让我们说如果角度是 45 度,那么它会搜索 (0,0) 然后 (0,1) (1,0) 然后 (0,2) , (1,1) ,(2 ,0) 依此类推.. .(抱歉无法上传图片,因为我是新用户并且不允许这样做,可以尝试想象/绘制一个有助于理解我想说的话的数组) 但是如果用户输入像 20 度这样的角度会发生什么,我们如何确定如何搜索数组。

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

谢谢各位。

【问题讨论】:

    标签: algorithm math geometry


    【解决方案1】:

    简单。采取一个角度(假设是 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(红色)与蓝线的交点。

    【讨论】:

    • 你能上传一张图片吗?你的解决方案看起来像莫顿曲线吗?
    • 绝对不是莫顿曲线,我认为我们在 OP 的问题上存在分歧。
    • 感谢您的图片,但我想到了一个带有 Excel 排序点的二维图。不过看起来很有趣。
    • @Frevez 非常感谢。我想这正是我想要的。最终我想要的是我可以轻松地在阵列之间移动。就像我可以轻松地从 row 跳转到 row-1 和 col 到 col +1 或类似的东西..所以我想通过以你提到的方式遍历数组,我将在缓存中写入新的 rowNum 和 colNum 并使用它.非常感谢..
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 2016-09-04
        相关资源
        最近更新 更多