diff --git a/keywords.txt b/keywords.txt index 5c7d60b..7c93dfc 100644 --- a/keywords.txt +++ b/keywords.txt @@ -10,8 +10,8 @@ Font KEYWORD1 Image KEYWORD1 ########################################## -# Methods and Functions -########################################## +# Methods and Functions +########################################## begin KEYWORD2 end KEYWORD2 @@ -33,6 +33,8 @@ line KEYWORD2 point KEYWORD2 quad KEYWORD2 rect KEYWORD2 +ellipse KEYWORD2 +circle KEYWORD2 text KEYWORD2 textFont KEYWORD2 diff --git a/src/ArduinoGraphics.cpp b/src/ArduinoGraphics.cpp index bedd1a7..f59bfc1 100644 --- a/src/ArduinoGraphics.cpp +++ b/src/ArduinoGraphics.cpp @@ -184,6 +184,106 @@ void ArduinoGraphics::rect(int x, int y, int width, int height) } } +void ArduinoGraphics::ellipse(int x, int y, int width, int height) +{ + if (!_stroke && !_fill) { + return; + } + + int r1 = (int)(width/2); + int r2 = (int)(height/2); + + x--; + y--; + + for(int i = 0; i < r1; i++) + { + int j = ceil(sqrt(1 - ((float)(i*i)/(r1*r1))) * r2); + + int x1 = x-i; + int x2 = x+i; + int y1 = y-j; + int y2 = y+j; + + if(width%2 == 0) + { + x2--; + } + + if(height%2 == 0) + { + y2--; + } + + if(_stroke) + { + set(x1, y1, _strokeR, _strokeG, _strokeB); + set(x1, y2, _strokeR, _strokeG, _strokeB); + set(x2, y1, _strokeR, _strokeG, _strokeB); + set(x2, y2, _strokeR, _strokeG, _strokeB); + } + + if(_fill) + { + for(int a = 0; a < j; a++) + { + int x1 = x-i; + int x2 = x+i; + int y1 = y-a; + int y2 = y+a; + + if(width%2 == 0) + { + x2--; + } + + if(height%2 == 0) + { + y2--; + } + + set(x1, y1, _fillR, _fillG, _fillB); + set(x1, y2, _fillR, _fillG, _fillB); + set(x2, y1, _fillR, _fillG, _fillB); + set(x2, y2, _fillR, _fillG, _fillB); + } + } + } + + if(_stroke) + { + for(int j = 0; j < r2; j++) + { + int i = ceil(sqrt(1 - ((float)(j*j)/(r2*r2))) * r1); + + int x1 = x-i; + int x2 = x+i; + int y1 = y-j; + int y2 = y+j; + + if(width%2 == 0) + { + x2--; + } + + if(height%2 == 0) + { + y2--; + } + + set(x1, y1, _strokeR, _strokeG, _strokeB); + set(x1, y2, _strokeR, _strokeG, _strokeB); + set(x2, y1, _strokeR, _strokeG, _strokeB); + set(x2, y2, _strokeR, _strokeG, _strokeB); + } + } +} + +void ArduinoGraphics::circle(int x, int y, int radius) +{ + ellipse(x, y, ((radius*2)-1), ((radius*2)-1)); +} + void ArduinoGraphics::text(const char* str, int x, int y) { if (!_font || !_stroke) { @@ -365,7 +465,7 @@ void ArduinoGraphics::beginText(int x, int y, uint8_t r, uint8_t g, uint8_t b) _textR = r; _textG = g; - _textB = b; + _textB = b; } void ArduinoGraphics::beginText(int x, int y, uint32_t color) @@ -482,7 +582,7 @@ void ArduinoGraphics::lineHigh(int x1, int y1, int x2, int y2) xi = -1; dx = -dx; } - + int D = 2 * dx - dy; int x = x1; diff --git a/src/ArduinoGraphics.h b/src/ArduinoGraphics.h index f5468b0..1ff88df 100644 --- a/src/ArduinoGraphics.h +++ b/src/ArduinoGraphics.h @@ -22,6 +22,8 @@ #include +#include // added for sqrt, cos and sin functions + #include "Font.h" #include "Image.h" @@ -57,13 +59,14 @@ class ArduinoGraphics : public Print { void stroke(uint32_t color); void noStroke(); - //virtual void arc(int x, int y, int width, int height, int start, int stop); - //virtual void ellipse(int x, int y, int width, int height); virtual void line(int x1, int y1, int x2, int y2); virtual void point(int x, int y); //virtual void quad(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); //virtual void triangle(int x1, int y1, int x2, int y2, int x3, int y3); virtual void rect(int x, int y, int width, int height); + virtual void ellipse(int x, int y, int width, int height); + virtual void circle(int x, int y, int radius); + // virtual void arc(int x, int y, int radiusX, int radiusY, int start, int stop); virtual void text(const char* str, int x = 0, int y = 0); virtual void text(const String& str, int x = 0, int y = 0) { text(str.c_str(), x, y); }