我正在尝试使用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----
-------------
提前致谢!
答案 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。