【发布时间】:2011-06-03 05:08:42
【问题描述】:
循环遍历二维数组的正方形部分很容易,但是如何循环遍历圆形部分?
【问题讨论】:
-
二维数组的圆形截面?您能否再解释一下,因为我不知道这可能意味着什么?
-
可能是丹尼尔写的,只是我理解它是一个实心圆圈
标签: actionscript-3 for-loop multidimensional-array
循环遍历二维数组的正方形部分很容易,但是如何循环遍历圆形部分?
【问题讨论】:
标签: actionscript-3 for-loop multidimensional-array
我这样做的方法是做一个双 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
}
}
}
(代码只是伪代码,不是任何特定语言)。
【讨论】:
与使用三角函数(代价高昂)或圆方程相比,您可以做得更好,这最终需要取一个代价高昂的平方根。
这里有一个专门讨论这个主题的页面:
http://www.cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html
本质上,答案是您想弄清楚数组的每一行上圆的起点和终点是什么。为此,计算与前一行的“偏移量”,即与前一行的起点的“差异”(对于终点也是如此)。
可以使用导数以数学方式计算此差异。一种改进是使用双导数计算连续差异之间的差异。
无论如何,这种抽象的数学思想导致了中点圆算法,有时也称为 Bresenehan 的圆算法。有关算法本身的更多详细信息,请参阅维基百科:
【讨论】:
我猜你有这样的想法
[ ][ ][x][0][ ][ ]
[ ][x][ ][ ][1][ ]
[9][ ][ ][ ][ ][2]
[8][ ][ ][ ][ ][3]
[ ][7][ ][ ][4][ ]
[ ][ ][6][5][ ][ ]
如果是这样,您可能需要使用一些基本的三角函数。 我会使用三角函数来推进角度,直到获得下一个值并将它们添加到另一个数组(或将 [i,j] 坐标添加到新数组),因为角度中的步长不对应于偶数步长。
【讨论】: