Bresenham的中点算法,我如何填补空白?

时间:2013-10-09 14:09:22

标签: c++ 2d draw geometry

我正在尝试使用Bresenhams Midpoint Algorithm绘制一个圆圈(并最终填满整个圆圈)。它将成为基本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----
-------------

提前致谢!

1 个答案:

答案 0 :(得分:1)

更完整的答案:

你正在循环(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,并且接近结束时,每x需要更多y。 这就是为什么你需要再次迭代但是这次在一个列(y)上并为每个y计算两个x,基本上在上面的算法中切换x和y。