Всех приветствую. Возник такой вопрос, который наполовину связан с игрой и наполовину с программированием. В ходе разработки функций отрисовки нестандартных форм для областей (круги), возникла проблема: нужен алгоритм для размещения клеток-квадратов по точкам с координатами (это все будущие ячейки регионов, которые в сумме дадут круг). Нашел алгоритм Брезенхэма, который помог отрисовать окружности, но этого недостаточно, так как нужно круг затушевать. Как это реализовать?
P.S.: на скриншоте привожу пример, как в игре будут располагаться ячейки региона (отрисованы круги с радиусами 1 и 2 в точке (0;0), при наложении остаются пробелы; смещение координат там не учитывалось (при добавлении ячейки региона в точке образуется она выше и правее от указанной точки со стороной 32).
P.S.: на скриншоте привожу пример, как в игре будут располагаться ячейки региона (отрисованы круги с радиусами 1 и 2 в точке (0;0), при наложении остаются пробелы; смещение координат там не учитывалось (при добавлении ячейки региона в точке образуется она выше и правее от указанной точки со стороной 32).
Принятый ответ
Я бы определял принадлежность центров квадрата некой окружности. Не так интуитивно-однозначно как проверка принадлежности всех точек квадрата окружности, но гораздо удобнее с точки зрения реализации. Далее для каждой строки поочередно прогоняем алгоритм заливки(в случае, если заливка подразумевает заливку текстурой почвы - стоит учитывать что каждый квадрат почвы имеет размеры 32/32 и центры мелких квадратиков имеют смещение в 16.), закрашивая почву в пределах новоопределенных ректов. Поочередно построчно, т.к. возможно у вас возникнет ситуация черное-белое-черное-белое и вторая строка (если весь массив прогонять подряд, а не построчно) начнется с черного квадрата. Не вижу каких-либо вытекающих неудобств при разработке..
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Пушистый
0 = квадрата нет, 1= он есть
0|1|1|1|0
1|0|1|0|1
1|1|x|1|1
1|0|1|0|1
0|1|1|1|0
возьмём 2 за единицу меры, на основе от неё уже будем считать
т.е. допустим 0:0 - это сам центр твоего круга
квадраты сторонами 2х2
имея это, получаем точки центров квадратов: x:y
-4:4 | -2:4 | 0:4 | 2:4 | 4:4
-4:2 | -2:2 | 0:2 | 2:2 | 4:2
-4:0 | -2:0 | 0:0 | 2:0 | 4:0
-4:-2 | -2:-2 | 0:-2 | 2:-2 | 2:-2
-4:-4 | -2:-4 | 0:-4 | 2:-4 | 4:-4
В идеале, можешь сделать круги:
1й круг - 1 клетка 1х1
2й круг - 9 клеток 3х3
3й круг - 25 клеток 5х5
4й круг - 49 клеток 7х7
5й круг - 81 клетка 9х9
6й круг - 121 клетка 11х11
7й круг - 169 клеток 13х13
8й круг - 225 клеток 15х15
9й круг - 289 клеток 17х17
10й круг - 361 клетка 19х19
МБ легче будет написать алгоритм центров для этих кругов
например
-38:38| ... | 38:38
...........................
-38:-38| ... | 38:-38
и уже нарисовав один раз полный "круг" из необходимого кол-ва квадратов, уже будет понятно, какие квадраты зашриховывать, а какие нет
это делается через относительные координаты с проверкой на чётность нечётность
если нужно заполнить всё содержимое окружности квадратами то это заливка
ссылку скинул
Отредактирован Пушистый
DemonoiD, которая (x-a)^2+(y-b)^2=R^2? Да, это даже лучше, чем проверять расстояния.
По тестам получилось нечто похожее на круг (этот регион был сложен из кусочков - маленьких ячеек). Благодаря регистрации входа/выхода удалось зафиксировать результат. Нужно посмотреть, что произойдет с большими окружностями (пока что делюсь первыми результатами).