Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
draw2D.cpp@0:aad987efa134, 2016-10-18 (annotated)
- Committer:
- rkuo2000
- Date:
- Tue Oct 18 05:54:55 2016 +0000
- Revision:
- 0:aad987efa134
NuMaker-PFM-NUC472 : I2C LCD+IMU control a moving pointer
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| rkuo2000 | 0:aad987efa134 | 1 | #include <mbed.h> |
| rkuo2000 | 0:aad987efa134 | 2 | #include "draw2D.h" |
| rkuo2000 | 0:aad987efa134 | 3 | #include "ssd1306.h" |
| rkuo2000 | 0:aad987efa134 | 4 | |
| rkuo2000 | 0:aad987efa134 | 5 | SSD1306 LCD_2D; |
| rkuo2000 | 0:aad987efa134 | 6 | |
| rkuo2000 | 0:aad987efa134 | 7 | // draw Bresenham Line |
| rkuo2000 | 0:aad987efa134 | 8 | void Draw2D::drawLine(int x1, int y1, int x2, int y2, int fgColor, int bgColor) |
| rkuo2000 | 0:aad987efa134 | 9 | { |
| rkuo2000 | 0:aad987efa134 | 10 | int dy = y2 - y1; |
| rkuo2000 | 0:aad987efa134 | 11 | int dx = x2 - x1; |
| rkuo2000 | 0:aad987efa134 | 12 | int stepx, stepy; |
| rkuo2000 | 0:aad987efa134 | 13 | |
| rkuo2000 | 0:aad987efa134 | 14 | if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } |
| rkuo2000 | 0:aad987efa134 | 15 | if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } |
| rkuo2000 | 0:aad987efa134 | 16 | dy <<= 1; // dy is now 2*dy |
| rkuo2000 | 0:aad987efa134 | 17 | dx <<= 1; // dx is now 2*dx |
| rkuo2000 | 0:aad987efa134 | 18 | |
| rkuo2000 | 0:aad987efa134 | 19 | LCD_2D.drawPixel(x1,y1, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 20 | if (dx > dy) |
| rkuo2000 | 0:aad987efa134 | 21 | { |
| rkuo2000 | 0:aad987efa134 | 22 | int fraction = dy - (dx >> 1); // same as 2*dy - dx |
| rkuo2000 | 0:aad987efa134 | 23 | while (x1 != x2) |
| rkuo2000 | 0:aad987efa134 | 24 | { |
| rkuo2000 | 0:aad987efa134 | 25 | if (fraction >= 0) |
| rkuo2000 | 0:aad987efa134 | 26 | { |
| rkuo2000 | 0:aad987efa134 | 27 | y1 += stepy; |
| rkuo2000 | 0:aad987efa134 | 28 | fraction -= dx; // same as fraction -= 2*dx |
| rkuo2000 | 0:aad987efa134 | 29 | } |
| rkuo2000 | 0:aad987efa134 | 30 | x1 += stepx; |
| rkuo2000 | 0:aad987efa134 | 31 | fraction += dy; // same as fraction -= 2*dy |
| rkuo2000 | 0:aad987efa134 | 32 | LCD_2D.drawPixel(x1, y1, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 33 | } |
| rkuo2000 | 0:aad987efa134 | 34 | } else { |
| rkuo2000 | 0:aad987efa134 | 35 | int fraction = dx - (dy >> 1); |
| rkuo2000 | 0:aad987efa134 | 36 | while (y1 != y2) { |
| rkuo2000 | 0:aad987efa134 | 37 | if (fraction >= 0) { |
| rkuo2000 | 0:aad987efa134 | 38 | x1 += stepx; |
| rkuo2000 | 0:aad987efa134 | 39 | fraction -= dy; |
| rkuo2000 | 0:aad987efa134 | 40 | } |
| rkuo2000 | 0:aad987efa134 | 41 | y1 += stepy; |
| rkuo2000 | 0:aad987efa134 | 42 | fraction += dx; |
| rkuo2000 | 0:aad987efa134 | 43 | LCD_2D.drawPixel(x1, y1, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 44 | } |
| rkuo2000 | 0:aad987efa134 | 45 | } |
| rkuo2000 | 0:aad987efa134 | 46 | } |
| rkuo2000 | 0:aad987efa134 | 47 | |
| rkuo2000 | 0:aad987efa134 | 48 | // draw Bresenham Circle |
| rkuo2000 | 0:aad987efa134 | 49 | void Draw2D::drawCircle(int xc, int yc, int r, int fgColor, int bgColor) |
| rkuo2000 | 0:aad987efa134 | 50 | { |
| rkuo2000 | 0:aad987efa134 | 51 | int x = 0; |
| rkuo2000 | 0:aad987efa134 | 52 | int y = r; |
| rkuo2000 | 0:aad987efa134 | 53 | int p = 3 - 2 * r; |
| rkuo2000 | 0:aad987efa134 | 54 | if (!r) return; |
| rkuo2000 | 0:aad987efa134 | 55 | while (y >= x) // only formulate 1/8 of circle |
| rkuo2000 | 0:aad987efa134 | 56 | { |
| rkuo2000 | 0:aad987efa134 | 57 | LCD_2D.drawPixel(xc-x, yc-y, fgColor, bgColor);//upper left left |
| rkuo2000 | 0:aad987efa134 | 58 | LCD_2D.drawPixel(xc-y, yc-x, fgColor, bgColor);//upper upper left |
| rkuo2000 | 0:aad987efa134 | 59 | LCD_2D.drawPixel(xc+y, yc-x, fgColor, bgColor);//upper upper right |
| rkuo2000 | 0:aad987efa134 | 60 | LCD_2D.drawPixel(xc+x, yc-y, fgColor, bgColor);//upper right right |
| rkuo2000 | 0:aad987efa134 | 61 | LCD_2D.drawPixel(xc-x, yc+y, fgColor, bgColor);//lower left left |
| rkuo2000 | 0:aad987efa134 | 62 | LCD_2D.drawPixel(xc-y, yc+x, fgColor, bgColor);//lower lower left |
| rkuo2000 | 0:aad987efa134 | 63 | LCD_2D.drawPixel(xc+y, yc+x, fgColor, bgColor);//lower lower right |
| rkuo2000 | 0:aad987efa134 | 64 | LCD_2D.drawPixel(xc+x, yc+y, fgColor, bgColor);//lower right right |
| rkuo2000 | 0:aad987efa134 | 65 | if (p < 0) p += 4*(x++) + 6; |
| rkuo2000 | 0:aad987efa134 | 66 | else p += 4*((x++) - y--) + 10; |
| rkuo2000 | 0:aad987efa134 | 67 | } |
| rkuo2000 | 0:aad987efa134 | 68 | } |
| rkuo2000 | 0:aad987efa134 | 69 | |
| rkuo2000 | 0:aad987efa134 | 70 | void Draw2D::drawRectangle(int x0, int y0, int x1, int y1, int fgColor, int bgColor) |
| rkuo2000 | 0:aad987efa134 | 71 | { |
| rkuo2000 | 0:aad987efa134 | 72 | int x,y, tmp; |
| rkuo2000 | 0:aad987efa134 | 73 | if (x0>x1) { tmp = x1; x1 = x0; x0 = tmp; } |
| rkuo2000 | 0:aad987efa134 | 74 | if (y0>y1) { tmp = y1; y1 = y0; y0 = tmp; } |
| rkuo2000 | 0:aad987efa134 | 75 | for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y0,fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 76 | for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x0,y,fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 77 | for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y1,fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 78 | for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x1,y,fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 79 | } |
| rkuo2000 | 0:aad987efa134 | 80 | |
| rkuo2000 | 0:aad987efa134 | 81 | void Draw2D::drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, int fgColor, int bgColor) |
| rkuo2000 | 0:aad987efa134 | 82 | { |
| rkuo2000 | 0:aad987efa134 | 83 | drawLine(x0, y0, x1, y1, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 84 | drawLine(x1, y1, x2, y2, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 85 | drawLine(x0, y0, x2, y2, fgColor, bgColor); |
| rkuo2000 | 0:aad987efa134 | 86 | } |
| rkuo2000 | 0:aad987efa134 | 87 |