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

标签 c++ geometry 2d draw bresenham

我正在尝试使用 Bresenham 的中点算法绘制一个圆(并最终填满整个圆)。它将成为基本 2D 游戏中 war 迷雾的轮廓。

我不是画一条线或填充一个像素,而是更改二维 vector 中的值。这可以正常工作,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----
-------------

提前致谢!

最佳答案

更完整的答案:

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

关于c++ - Bresenham 的中点算法,我如何填补空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19274433/

相关文章:

c++ - 在调试器中查看 C++ shared_ptr 内容

python - 为什么随机生成的标签会加速另一个移动标签的速度?

javascript - 在网络中绘制斐波那契数错误

c# - 在网格布局中创建动态按钮 - 创建幻方 UI

c++ - 在 DirectX Windows 8 应用程序中播放声音

c++ - 处理 WinAPI 错误返回值

c++ - 如何为通过共享指针在不同模块之间传递的模板类分配内存

r - 如何从外部近似椭圆?

c++ - 如何用 C++ 编写菱形方 block 算法?

php - 使用 Autodesk Forge 从 IFC 文件获取几何数据(尺寸)