2011-01-04 8 views
3

2次元配列の四角い部分をループするのは簡単ですが、円形の部分をどのようにループしますか?2d配列の値の円をどのようにループしますか?

+0

円形断面:アルゴリズム自体の詳細についてはウィキペディアを参照してください?それがどういう意味か分かりませんので少し説明できますか? – sberry

+0

ダニエルが書いたことはありそうですが、私はそれが黒い円であることを理解しています。 –

答えて

8

私がこれをやったやり方は、2dアレイを普通にループするのと同じように、2回for-loopをすることです。しかし、このループの中で、問題の配列要素が距離式を使って半径rの円内にあるかどうかを確認してください。例えば

、(x、y)に10×10のアレイ、およびアレイの選択された "中心" を与えられた:

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 
     } 
    } 
} 

を(コードだけ擬似コードではなく、任意の特定の言語です)。

+0

ニース擬似コード;中括弧を削除してください。有効なLiveScript(: –

1

私はあなたが心の中でこのような何か

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

それがそうであるならば、あなたはいくつかの基本的な三角法を使用する必要がありますがありgussingよ。 角度のステップが偶数のステップに対応しないため、次の値を取得して別の配列に追加するまで(または新しい配列に[i、j]座標を追加するまで)、trigを使用して角度を前進させます。

3

trig関数(これは高価です)を使うか、円の方程式を使うよりも、はるかに優れています。これは最終的には高価な平方根を必要とします。ここでの主題に捧げられるページがあり

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

本質的にはその答えは、あなたが円の開始点と終了点は、あなたの配列の各行にあるかを把握したいということです。これを行うには、前の行からの「オフセット」、すなわち前の行の開始点からの「差」(および同様に終点について)を計算する。

この差は、微係数を使用して数学的に計算できます。改良は、二重微分を用いて連続する差の差を計算することである。

とにかく、この抽象的な数学的アイデアは、Bresenehanサークルアルゴリズムと呼ばれるミッドポイントサークルアルゴリズムにつながります。 2次元配列の

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

関連する問題