1

ブレゼンハムの中点アルゴリズムを使用して、円を描画しようとしています (最終的には円全体を塗りつぶします)。基本的な 2D ゲームでのフォグ オブ ウォーのアウトラインになります。

線を描いたりピクセルを塗りつぶしたりする代わりに、2D ベクトルの値を変更しています。これは正しく機能しmapMatrix、このコードで変更された場所は正しく表示されます。

ただし、円の下部と上部のみが表示されます。ギャップを埋めるにはどうすればよいですか?

int d = 3 - (2 * radius);
int x = 0;
int y = radius;

while (x <= y)
{
    mapMatrix[centerX + x][centerY + y].fog = false;
    mapMatrix[centerX + x][centerY - y].fog = false;
    mapMatrix[centerX - x][centerY + y].fog = false;
    mapMatrix[centerX - x][centerY - y].fog = false;
    mapMatrix[centerX + x][centerY + y].fog = false;
    mapMatrix[centerX + x][centerY - y].fog = false;
    mapMatrix[centerX - x][centerY + y].fog = false;
    mapMatrix[centerX - x][centerY - y].fog = false;

    if (d < 0) 
    {
        d = (d + (4*x) + 6);
    } 
    else 
    {
        d = ((d + 4 * (x - y)) + 10);
        y--;
    }
    x++;
} 

出力の写真を載せることができるので、この粗雑な ASCII 図面を見てください。

-------------
----ooooo----
---o-----o---
-------------
-------------
-------------
------o------
-------------
-------------
-------------
---o-----o---
----ooooo----
-------------

前もって感謝します!

4

1 に答える 1

1

より完全な答え:

while (x<=y) をループしています。つまり、最後の反復は x == y のときです。ただし、 x == y は対角線上のみであるため、ここで停止します。

x------------
-x--ooooo----
--xo-----o---
---x---------
----x--------
-----x-------
------x------
-------x-----
--------x----
---------x---
---o-----ox--
----ooooo--x-
------------x

円を反復していません。線 (x) を反復しているだけで、上下の y を計算しています。

すべての x に対して y は 2 つしかないことに注意してください。最後の近くでは、すべての x に対してさらに y が必要になります。これが、もう一度反復する必要がある理由ですが、今回は列 (y) で y ごとに 2 つの x を計算し、基本的に上記のアルゴリズムで x と y を切り替えます。

于 2013-10-09T21:11:55.417 に答える