【问题标题】:How do you loop through a circle of values in a 2d array?如何循环遍历二维数组中的一圈值?
【发布时间】:2011-06-03 05:08:42
【问题描述】:

循环遍历二维数组的正方形部分很容易,但是如何循环遍历圆形部分?

【问题讨论】:

  • 二维数组的圆形截面?您能否再解释一下,因为我不知道这可能意味着什么?
  • 可能是丹尼尔写的,只是我理解它是一个实心圆圈

标签: actionscript-3 for-loop multidimensional-array


【解决方案1】:

我这样做的方法是做一个双 for 循环,就像你通常循环遍历 2d 数组一样。然而,在这个循环中,使用距离公式检查所讨论的数组元素是否在半径为 r 的圆内。

例如,给定一个 10x10 的数组,并在 (x,y) 处选择数组的“中心”:

for i from 0 to 9 {
    for j from 0 to 9 {
        a = i - x
        b = j - y
        if a*a + b*b <= r*r {
            // Do something here
        }
    }
}

(代码只是伪代码,不是任何特定语言)。

【讨论】:

  • 不错的伪代码;删除大括号,这是有效的 LiveScript (:
【解决方案2】:

与使用三角函数(代价高昂)或圆方程相比,您可以做得更好,这最终需要取一个代价高昂的平方根。

这里有一个专门讨论这个主题的页面:

http://www.cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html

本质上,答案是您想弄清楚数组的每一行上圆的起点和终点是什么。为此,计算与前一行的“偏移量”,即与前一行的起点的“差异”(对于终点也是如此)。

可以使用导数以数学方式计算此差异。一种改进是使用双导数计算连续差异之间的差异。

无论如何,这种抽象的数学思想导致了中点圆算法,有时也称为 Bresenehan 的圆算法。有关算法本身的更多详细信息,请参阅维基百科:

http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

【讨论】:

    【解决方案3】:

    我猜你有这样的想法

    [ ][ ][x][0][ ][ ]
    [ ][x][ ][ ][1][ ]
    [9][ ][ ][ ][ ][2]
    [8][ ][ ][ ][ ][3]
    [ ][7][ ][ ][4][ ]
    [ ][ ][6][5][ ][ ]
    

    如果是这样,您可能需要使用一些基本的三角函数。 我会使用三角函数来推进角度,直到获得下一个值并将它们添加到另一个数组(或将 [i,j] 坐标添加到新数组),因为角度中的步长不对应于偶数步长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2019-02-04
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多