В настоящее время я использую алгоритм рисования круга Bresenham, который рисует круги отлично, однако я бы хотел относительно быстрый и эффективный способ нарисовать круг с заданной толщиной (так как метод Брешенема только рисует толщину одного пикселя). Я понимаю, что я мог бы просто рисовать несколько кругов с разными радиусами, но я считаю, что это будет очень неэффективно (и эффективность важна, потому что это будет работать на Arduino, где каждая микросекунда драгоценна). настоящее время я использую следующий код:Круг с алгоритмом рисования толщины
void circle(byte xc, byte yc, int radius, Colour colour) {
int x = -radius, y = 0, err = 2 - 2 * radius;
while(x < 0) {
setPixel(xc - x, yc + y, colour);
setPixel(xc - y, yc - x, colour);
setPixel(xc + x, yc - y, colour);
setPixel(xc + y, yc + x, colour);
radius = err;
if(radius <= y) {
err += ++y * 2 + 1;
}
if(radius > x || err > y) {
err += ++x * 2 + 1;
}
}
}
Как я мог это изменить, чтобы для уточнения толщины окружности? PS Я не хочу использовать какие-либо внешние библиотеки, пожалуйста!
Обычный подход состоит в том, чтобы нарисовать 2 круга (внутренний и внешний), затем заполнить пробел, используя соответствующее правило заполнения (например, http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule). – oakad
Да, но разве это не слишком медленно? –
Вы можете использовать «сжатый» посредник: создать массив связанных списков для представления целевой поверхности (поэтому каждый связанный список представляет собой строку сканирования). Используйте алгоритм Брешенема, чтобы помещать узлы для каждого «черного» пикселя в каждый соответствующий список строк сканирования. Переместите полученную структуру с правилом заполнения, чтобы рисовать на целевой поверхности (в каждом списке будет всего 2-4 узла). – oakad