From 18029b9e043633e4bf33839c93a14f44f0a034c3 Mon Sep 17 00:00:00 2001 From: Daniel Eichhorn <dani.eichhorn@squix.ch> Date: Fri, 20 May 2016 17:46:59 +0200 Subject: [PATCH] Rewrote fillCircle method... --- SSD1306.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/SSD1306.cpp b/SSD1306.cpp index 0b41890..c71978e 100644 --- a/SSD1306.cpp +++ b/SSD1306.cpp @@ -135,16 +135,24 @@ void SSD1306::drawCircle(int16_t x0, int16_t y0, int16_t radius) { setPixel(x0, y0 - radius); } -void SSD1306::fillCircle(int16_t x, int16_t y, int16_t radius) { - int sqrRadius = radius * radius; - for (int xv = -radius; xv < radius; xv++) { - for (int yv = -radius; yv < radius; yv++) { - int currentSqrRadius = xv * xv + yv * yv; - if (currentSqrRadius <= sqrRadius) { - setPixel(x + xv, y + yv); - } - } - } +void SSD1306::fillCircle(int16_t x0, int16_t y0, int16_t radius) { + int16_t x = 0, y = radius; + int16_t dp = 1 - radius; + do { + if (dp < 0) + dp = dp + 2 * (++x) + 3; + else + dp = dp + 2 * (++x) - 2 * (--y) + 5; + + drawHorizontalLine(x0 - x, y0 - y, 2*x); + drawHorizontalLine(x0 - x, y0 + y, 2*x); + drawHorizontalLine(x0 - y, y0 - x, 2*y); + drawHorizontalLine(x0 - y, y0 + x, 2*y); + + + } while (x < y); + drawHorizontalLine(x0 - radius, y0, 2 * radius); + } void SSD1306::drawHorizontalLine(int16_t x, int16_t y, int16_t length) { -- GitLab