Richard Kuo
/
NTOUEE-mbed-I2C_LCD_movingcircle
mbed I2C to LCD for drawing a moving circle
draw2D.cpp@0:5e40d147a8e1, 2016-10-20 (annotated)
- Committer:
- rkuo2000
- Date:
- Thu Oct 20 13:05:10 2016 +0000
- Revision:
- 0:5e40d147a8e1
mbed I2C to LCD for drawing a moving circle
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rkuo2000 | 0:5e40d147a8e1 | 1 | #include <mbed.h> |
rkuo2000 | 0:5e40d147a8e1 | 2 | #include "draw2D.h" |
rkuo2000 | 0:5e40d147a8e1 | 3 | #include "ssd1306.h" |
rkuo2000 | 0:5e40d147a8e1 | 4 | |
rkuo2000 | 0:5e40d147a8e1 | 5 | SSD1306 LCD_2D; |
rkuo2000 | 0:5e40d147a8e1 | 6 | |
rkuo2000 | 0:5e40d147a8e1 | 7 | // draw Bresenham Line |
rkuo2000 | 0:5e40d147a8e1 | 8 | void Draw2D::drawLine(int x1, int y1, int x2, int y2, int fgColor, int bgColor) |
rkuo2000 | 0:5e40d147a8e1 | 9 | { |
rkuo2000 | 0:5e40d147a8e1 | 10 | int dy = y2 - y1; |
rkuo2000 | 0:5e40d147a8e1 | 11 | int dx = x2 - x1; |
rkuo2000 | 0:5e40d147a8e1 | 12 | int stepx, stepy; |
rkuo2000 | 0:5e40d147a8e1 | 13 | |
rkuo2000 | 0:5e40d147a8e1 | 14 | if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } |
rkuo2000 | 0:5e40d147a8e1 | 15 | if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } |
rkuo2000 | 0:5e40d147a8e1 | 16 | dy <<= 1; // dy is now 2*dy |
rkuo2000 | 0:5e40d147a8e1 | 17 | dx <<= 1; // dx is now 2*dx |
rkuo2000 | 0:5e40d147a8e1 | 18 | |
rkuo2000 | 0:5e40d147a8e1 | 19 | LCD_2D.drawPixel(x1,y1, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 20 | if (dx > dy) |
rkuo2000 | 0:5e40d147a8e1 | 21 | { |
rkuo2000 | 0:5e40d147a8e1 | 22 | int fraction = dy - (dx >> 1); // same as 2*dy - dx |
rkuo2000 | 0:5e40d147a8e1 | 23 | while (x1 != x2) |
rkuo2000 | 0:5e40d147a8e1 | 24 | { |
rkuo2000 | 0:5e40d147a8e1 | 25 | if (fraction >= 0) |
rkuo2000 | 0:5e40d147a8e1 | 26 | { |
rkuo2000 | 0:5e40d147a8e1 | 27 | y1 += stepy; |
rkuo2000 | 0:5e40d147a8e1 | 28 | fraction -= dx; // same as fraction -= 2*dx |
rkuo2000 | 0:5e40d147a8e1 | 29 | } |
rkuo2000 | 0:5e40d147a8e1 | 30 | x1 += stepx; |
rkuo2000 | 0:5e40d147a8e1 | 31 | fraction += dy; // same as fraction -= 2*dy |
rkuo2000 | 0:5e40d147a8e1 | 32 | LCD_2D.drawPixel(x1, y1, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 33 | } |
rkuo2000 | 0:5e40d147a8e1 | 34 | } else { |
rkuo2000 | 0:5e40d147a8e1 | 35 | int fraction = dx - (dy >> 1); |
rkuo2000 | 0:5e40d147a8e1 | 36 | while (y1 != y2) { |
rkuo2000 | 0:5e40d147a8e1 | 37 | if (fraction >= 0) { |
rkuo2000 | 0:5e40d147a8e1 | 38 | x1 += stepx; |
rkuo2000 | 0:5e40d147a8e1 | 39 | fraction -= dy; |
rkuo2000 | 0:5e40d147a8e1 | 40 | } |
rkuo2000 | 0:5e40d147a8e1 | 41 | y1 += stepy; |
rkuo2000 | 0:5e40d147a8e1 | 42 | fraction += dx; |
rkuo2000 | 0:5e40d147a8e1 | 43 | LCD_2D.drawPixel(x1, y1, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 44 | } |
rkuo2000 | 0:5e40d147a8e1 | 45 | } |
rkuo2000 | 0:5e40d147a8e1 | 46 | } |
rkuo2000 | 0:5e40d147a8e1 | 47 | |
rkuo2000 | 0:5e40d147a8e1 | 48 | // draw Bresenham Circle |
rkuo2000 | 0:5e40d147a8e1 | 49 | void Draw2D::drawCircle(int xc, int yc, int r, int fgColor, int bgColor) |
rkuo2000 | 0:5e40d147a8e1 | 50 | { |
rkuo2000 | 0:5e40d147a8e1 | 51 | int x = 0; |
rkuo2000 | 0:5e40d147a8e1 | 52 | int y = r; |
rkuo2000 | 0:5e40d147a8e1 | 53 | int p = 3 - 2 * r; |
rkuo2000 | 0:5e40d147a8e1 | 54 | if (!r) return; |
rkuo2000 | 0:5e40d147a8e1 | 55 | while (y >= x) // only formulate 1/8 of circle |
rkuo2000 | 0:5e40d147a8e1 | 56 | { |
rkuo2000 | 0:5e40d147a8e1 | 57 | LCD_2D.drawPixel(xc-x, yc-y, fgColor, bgColor);//upper left left |
rkuo2000 | 0:5e40d147a8e1 | 58 | LCD_2D.drawPixel(xc-y, yc-x, fgColor, bgColor);//upper upper left |
rkuo2000 | 0:5e40d147a8e1 | 59 | LCD_2D.drawPixel(xc+y, yc-x, fgColor, bgColor);//upper upper right |
rkuo2000 | 0:5e40d147a8e1 | 60 | LCD_2D.drawPixel(xc+x, yc-y, fgColor, bgColor);//upper right right |
rkuo2000 | 0:5e40d147a8e1 | 61 | LCD_2D.drawPixel(xc-x, yc+y, fgColor, bgColor);//lower left left |
rkuo2000 | 0:5e40d147a8e1 | 62 | LCD_2D.drawPixel(xc-y, yc+x, fgColor, bgColor);//lower lower left |
rkuo2000 | 0:5e40d147a8e1 | 63 | LCD_2D.drawPixel(xc+y, yc+x, fgColor, bgColor);//lower lower right |
rkuo2000 | 0:5e40d147a8e1 | 64 | LCD_2D.drawPixel(xc+x, yc+y, fgColor, bgColor);//lower right right |
rkuo2000 | 0:5e40d147a8e1 | 65 | if (p < 0) p += 4*(x++) + 6; |
rkuo2000 | 0:5e40d147a8e1 | 66 | else p += 4*((x++) - y--) + 10; |
rkuo2000 | 0:5e40d147a8e1 | 67 | } |
rkuo2000 | 0:5e40d147a8e1 | 68 | } |
rkuo2000 | 0:5e40d147a8e1 | 69 | |
rkuo2000 | 0:5e40d147a8e1 | 70 | void Draw2D::drawRectangle(int x0, int y0, int x1, int y1, int fgColor, int bgColor) |
rkuo2000 | 0:5e40d147a8e1 | 71 | { |
rkuo2000 | 0:5e40d147a8e1 | 72 | int x,y, tmp; |
rkuo2000 | 0:5e40d147a8e1 | 73 | if (x0>x1) { tmp = x1; x1 = x0; x0 = tmp; } |
rkuo2000 | 0:5e40d147a8e1 | 74 | if (y0>y1) { tmp = y1; y1 = y0; y0 = tmp; } |
rkuo2000 | 0:5e40d147a8e1 | 75 | for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y0,fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 76 | for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x0,y,fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 77 | for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y1,fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 78 | for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x1,y,fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 79 | } |
rkuo2000 | 0:5e40d147a8e1 | 80 | |
rkuo2000 | 0:5e40d147a8e1 | 81 | void Draw2D::drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, int fgColor, int bgColor) |
rkuo2000 | 0:5e40d147a8e1 | 82 | { |
rkuo2000 | 0:5e40d147a8e1 | 83 | drawLine(x0, y0, x1, y1, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 84 | drawLine(x1, y1, x2, y2, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 85 | drawLine(x0, y0, x2, y2, fgColor, bgColor); |
rkuo2000 | 0:5e40d147a8e1 | 86 | } |
rkuo2000 | 0:5e40d147a8e1 | 87 |