Hallo!
Ich nutze momentan sehr viel mein I²C-OLED und habe vorhin festgestellt, dass meine Lib keine Möglichkeit bietet, einen ausgefüllten Ring auf den Schirm zu bringen. Da ich gerne auch die Mitte des Rings durchsichtig haben wollte, kam es auch nicht in Frage, einen großen Kreis mit einem kleinen Kreis in der anderen Farbe darin zu zeichnen. Also habe ich ein wenig mich mit dem Kreis-Bresenham-Algorithmus auseinander gesetzt, der u.a. bei der "Adafruit GFX"-Lib zum Einsatz kommt, und habe folgendes daraus gemacht (für einen Quadranten, mir ist klar, dass er nicht fertig ist):
#include <Wire.h>
#include "SH1106Wire.h"
SH1106Wire display(0x3c, SDA, SCL);
void ring(int16_t x0, int16_t y0, int16_t radius, int16_t radius2){
int16_t x = 0, y = radius;
int16_t dp = 1 - radius;
int16_t x2 = 0, y2 = radius2;
int16_t dp2 = 1 - radius2;
do {
if (dp < 0)
dp = dp + (x++) * 2 + 3;
else
dp = dp + (x++) * 2 - (y--) * 2 + 5;
if(x2 < y2){
if (dp2 < 0)
dp2 = dp2 + (x2++) * 2 + 3;
else
dp2 = dp2 + (x2++) * 2 - (y2--) * 2 + 5;
}
else{
x2++;
y2++;
}
display.setPixel(x0 - x, y0 - y);
display.setPixel(x0 - x2, y0 - y2);
display.drawLine(x0 - x, y0 - y, x0 - x, y0 - y2);
//display.drawHorizontalLine(x0 - x, y0 + y, 2*x + 1);
display.setPixel(x0 - y, y0 - x);
display.setPixel(x0 - y2, y0 - x2);
display.drawLine(x0 - y, y0 - x, x0 - y2, y0 - x);
//display.drawHorizontalLine(x0 - y, y0 + x, 2*y + 1);
display.display();
delay(250);
} while (x < y);
display.setPixel(x0, y0);
display.display();
}
void setup() {
display.init();
display.flipScreenVertically();
display.clear();
display.setColor(WHITE);
ring(32, 32, 20, 10);
display.setColor(INVERSE);
ring(96, 32, 20, 10);
}
void loop() {
}
Der Algorithmus funktioniert mit WHITE perfekt. Aber wenn ich ihn mit INVERSE benutze, dann bekomme ich einen schwarzen Strich in der Mitte (s. Anhang). Ich weiß, dass das eigentlich egal ist, wenn ich einen INVERSE-Ring haben will, dann mache ich das halt mit zwei gewöhnlichen Kreisen, aber das finde ich irgendwie nicht ganz zufriedenstellend, zumal das ja bedeutet, dass ich Pixel doppelt färbe, was ja Verschwendung von CPU-Leistung ist. Gibt es eine Möglichkeit, dieses Problem leicht und sinnreich zu beheben? Oder habe ich vielleicht eine ganz falsche Herangehensweise gewählt?
Gruß
HTML-Fan