2016-12-14 4 views
2

を-elements:反復処理(i、j)が円形に2つ(非常に単純化された)クラスを考える

for (int i = iL; i < iL-width; i--) 
    for (int j = jL; j < jL+length; j++) 
    doSomething(); 

私の問題はCircle内のすべての要素を反復処理するスマートな方法を実装することです。次のように私の現在のソリューションは、になります(私はCircleではないと私はいつもpowを評価する必要があるため、多くの要素に触れているので)

for (int i = iC-radius; i <= iC+radius; i++) 
    for (int j = jC-radius; j <= jC+radius; j++) 
    if (sqrt(pow(i-iC,2)+pow(j-jC,2)) <= r) // checking if (i,j) lies within the circle (or its boundary) 
     doSomething(); 

はしかし、radiusが大きい私の現在のソリューションを取得するために非常に時間が高価です。 Circleすべての要素に対して、よりインテリジェントで効率的な反復方法を考えることができますか?

+0

[極座標システム] Polar_coordinate_system) – Drop

+0

私は、いくつかの円と長方形が横たわっている離散的な2次元形状(i、j点を持つ)を得ました。私が極座標を使用する場合、私は同じ問題を抱えています:どのように角度\ phiを反復すべきですか?私はsthが必要です。 (psuedocode :) '(double phi = 0; phi <360; phi ++)'のようなものであり、これは不可能です。 – Kapa11

+0

http://stackoverflow.com/a/7227057/6313992 –

答えて

4

すべての行について、円に属する最初の列を見つけて、この列から円の中心に対してミラー化された列に移動します。擬似コード

for (int iy = - radius to radius; iy++) 
    dx = (int) sqrt(radius * radius - iy * iy) 
    for (int ix = - dx to dx; ix++) 
     doSomething(CX + ix, CY + iy); 
+0

ありがとう、私はそれをテストします。しかし、私はキャッシュローカル性を改善するためにix-とiy- loopを変更します:) – Kapa11

+0

Emm ...ほとんどの言語(C++を含む)では、2D配列は「行ごとに」格納されます。おそらく、あなたは他のいくつかの状況を意味するでしょう... – MBo

+0

あなたのコードスニペットでは、各y(j方向)を繰り返し、次にすべてのx(i方向)を繰り返します。したがって、各列について、各行をチェックします。しかし、あなたが言ったように、各行を次々にチェックする方が良いでしょう。 – Kapa11

0

円の半径をrとします。描かれる円の周りの大きさ(2r + 1)*(2r + 1)の正方形を考えてみましょう。したがって、平方の等距離点は2D配列に格納されます。

ここで、正方形内のすべての点を歩きます。すべてのポイント(x、y)について、(x、y)が円の内側にある場合(またはx^2 + y^2 < r^2)、それを印刷します。たとえば、等距離点は10x10の配列を形成し、配列の選択された「中心」は(x、y)になります。

+0

私は現時点でやっていることと私が快適ではないコード?!?! – Kapa11

関連する問題