mbed I2C to LCD for drawing a moving circle

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?

UserRevisionLine numberNew 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