Алгоритм средней точки Bressenhams, как мне заполнить пробелы?

Я пытаюсь нарисовать круг (и в конечном итоге заполнить весь круг), используя алгоритм средней точки Брезенхамса. Он станет очертанием тумана войны в базовой 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

Решение

Более полный ответ:

Вы цикл пока (х<= У). это означает, что последняя итерация — это когда 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 в приведенном выше алгоритме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector