Я пытаюсь нарисовать круг (и в конечном итоге заполнить весь круг), используя алгоритм средней точки Брезенхамса. Он станет очертанием тумана войны в базовой 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----
-------------
Заранее спасибо!
Более полный ответ:
Вы цикл пока (х<= У). это означает, что последняя итерация — это когда x == y. но х == у только по диагонали, так что здесь вы остановитесь:
x------------
-x--ooooo----
--xo-----o---
---x---------
----x--------
-----x-------
------x------
-------x-----
--------x----
---------x---
---o-----ox--
----ooooo--x-
------------x
Вы не перебираете круг, вы перебираете только строку (x) и вычисляете верхний и нижний у.
Обратите внимание, что для каждого x есть только два y, а ближе к концу вам понадобится больше y для каждого x.
Вот почему вам нужно повторить итерацию, но на этот раз для столбца (y) и вычислить два x для каждого y, в основном переключая x и y в приведенном выше алгоритме.
Других решений пока нет …