Added methods for drawing lines and circles to Window.
This commit is contained in:
		@@ -18,7 +18,10 @@ public:
 | 
				
			|||||||
	void clear(CRGB* color);
 | 
						void clear(CRGB* color);
 | 
				
			||||||
	void setPixel(uint8_t x, uint8_t y, CRGB* color);
 | 
						void setPixel(uint8_t x, uint8_t y, CRGB* color);
 | 
				
			||||||
	void setPixelByIndex(uint16_t index, CRGB* color);
 | 
						void setPixelByIndex(uint16_t index, CRGB* color);
 | 
				
			||||||
	void line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, CRGB* color, bool antialias=false);
 | 
						void line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, CRGB* color);
 | 
				
			||||||
 | 
						void lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t length, CRGB* color);
 | 
				
			||||||
 | 
						void lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t startdist, uint8_t length, CRGB* color);
 | 
				
			||||||
 | 
						void circle(uint8_t x, uint8_t y, uint8_t r, CRGB* color);
 | 
				
			||||||
	uint16_t coordsToGlobalIndex(uint8_t x, uint8_t y);
 | 
						uint16_t coordsToGlobalIndex(uint8_t x, uint8_t y);
 | 
				
			||||||
	uint16_t localToGlobalIndex(uint16_t);
 | 
						uint16_t localToGlobalIndex(uint16_t);
 | 
				
			||||||
	void drawChar(Font* f, uint8_t x, uint8_t y, const char c, CRGB* color, bool mask=false);
 | 
						void drawChar(Font* f, uint8_t x, uint8_t y, const char c, CRGB* color, bool mask=false);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,3 +60,75 @@ void Window::fadeToBlackBy(fract8 speed) {
 | 
				
			|||||||
		leds[coordsToGlobalIndex(x, y)].nscale8(255 - speed);
 | 
							leds[coordsToGlobalIndex(x, y)].nscale8(255 - speed);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, CRGB* color) {
 | 
				
			||||||
 | 
						// Bresenham algorithm
 | 
				
			||||||
 | 
						int16_t dx = abs(x2-x1);
 | 
				
			||||||
 | 
						int16_t dy = abs(y2-y1);
 | 
				
			||||||
 | 
						int8_t sx = x1<x2 ? 1 : -1;
 | 
				
			||||||
 | 
						int8_t sy = y1<y2 ? 1 : -1;
 | 
				
			||||||
 | 
						int16_t err = dx + dy;
 | 
				
			||||||
 | 
						int16_t e2;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							setPixel(x1, y1, color);
 | 
				
			||||||
 | 
							if (x1==x2 && y1==y2) break;
 | 
				
			||||||
 | 
							e2 = 2*err;
 | 
				
			||||||
 | 
							if (e2 > dy) { err += dy; x1 += sx; }
 | 
				
			||||||
 | 
							if (e2 < dx) { err += dx; y1 += sy; }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::circle(uint8_t x0, uint8_t y0, uint8_t radius, CRGB* color) {
 | 
				
			||||||
 | 
						// Again, Bresenham
 | 
				
			||||||
 | 
						uint8_t f = 1 - radius;
 | 
				
			||||||
 | 
						int16_t ddF_x = 0;
 | 
				
			||||||
 | 
						int16_t ddF_y = -2 * radius;
 | 
				
			||||||
 | 
						uint8_t x = 0;
 | 
				
			||||||
 | 
						uint8_t y = radius;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						setPixel(x0, y0 + radius, color);
 | 
				
			||||||
 | 
						setPixel(x0, y0 - radius, color);
 | 
				
			||||||
 | 
						setPixel(x0 + radius, y0, color);
 | 
				
			||||||
 | 
						setPixel(x0 - radius, y0, color);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						while (x < y) {
 | 
				
			||||||
 | 
							if (f >= 0) {
 | 
				
			||||||
 | 
								y--;
 | 
				
			||||||
 | 
								ddF_y += 2;
 | 
				
			||||||
 | 
								f += ddF_y;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							x++;
 | 
				
			||||||
 | 
							ddF_x += 2;
 | 
				
			||||||
 | 
							f += ddF_x + 1;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							setPixel(x0 + x, y0 + y, color);
 | 
				
			||||||
 | 
							setPixel(x0 - x, y0 + y, color);
 | 
				
			||||||
 | 
							setPixel(x0 + x, y0 - y, color);
 | 
				
			||||||
 | 
							setPixel(x0 - x, y0 - y, color);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							setPixel(x0 + y, y0 + x, color);
 | 
				
			||||||
 | 
							setPixel(x0 - y, y0 + x, color);
 | 
				
			||||||
 | 
							setPixel(x0 + y, y0 - x, color);
 | 
				
			||||||
 | 
							setPixel(x0 - y, y0 - x, color);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t length, CRGB* color) {
 | 
				
			||||||
 | 
						lineWithAngle(x, y, angle, 0, length, color);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::lineWithAngle(uint8_t x, uint8_t y, uint8_t angle, uint8_t startdist, uint8_t length, CRGB* color) {
 | 
				
			||||||
 | 
						int16_t x1 = x;
 | 
				
			||||||
 | 
						int16_t y1 = y;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (startdist > 0) {
 | 
				
			||||||
 | 
							x1 = x + scale8(startdist, cos8(angle));
 | 
				
			||||||
 | 
							y1 = y + scale8(startdist, sin8(angle));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						int16_t x2 = x + scale8(startdist + length, cos8(angle));
 | 
				
			||||||
 | 
						int16_t y2 = y + scale8(startdist + length, sin8(angle));
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						line(x1, y1, x2, y2, color);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user