NuMaker-PFM-NUC472: I2C1 LCD draw a moving circle

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers draw2D.cpp Source File

draw2D.cpp

00001 #include <mbed.h>
00002 #include "draw2D.h"
00003 #include "ssd1306.h"
00004 
00005 SSD1306  LCD_2D;
00006 
00007 // draw Bresenham Line
00008 void Draw2D::drawLine(int x1, int y1, int x2, int y2, int fgColor, int bgColor)
00009 {
00010     int dy = y2 - y1;
00011     int dx = x2 - x1;
00012     int stepx, stepy;
00013 
00014     if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
00015     if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
00016     dy <<= 1;        // dy is now 2*dy
00017     dx <<= 1;        // dx is now 2*dx
00018 
00019     LCD_2D.drawPixel(x1,y1, fgColor, bgColor);
00020     if (dx > dy) 
00021     {
00022         int fraction = dy - (dx >> 1);  // same as 2*dy - dx
00023         while (x1 != x2) 
00024         {
00025            if (fraction >= 0) 
00026            {
00027                y1 += stepy;
00028                fraction -= dx;          // same as fraction -= 2*dx
00029            }
00030            x1 += stepx;
00031            fraction += dy;              // same as fraction -= 2*dy
00032            LCD_2D.drawPixel(x1, y1, fgColor, bgColor);
00033         }
00034      } else {
00035         int fraction = dx - (dy >> 1);
00036         while (y1 != y2) {
00037            if (fraction >= 0) {
00038                x1 += stepx;
00039                fraction -= dy;
00040            }
00041            y1 += stepy;
00042            fraction += dx;
00043            LCD_2D.drawPixel(x1, y1, fgColor, bgColor);
00044         }
00045      }
00046 }
00047 
00048 // draw Bresenham Circle
00049 void Draw2D::drawCircle(int xc, int yc, int r, int fgColor, int bgColor)
00050 {
00051     int x = 0; 
00052     int y = r; 
00053     int p = 3 - 2 * r;
00054     if (!r) return;     
00055     while (y >= x) // only formulate 1/8 of circle
00056     {
00057         LCD_2D.drawPixel(xc-x, yc-y, fgColor, bgColor);//upper left left
00058         LCD_2D.drawPixel(xc-y, yc-x, fgColor, bgColor);//upper upper left
00059         LCD_2D.drawPixel(xc+y, yc-x, fgColor, bgColor);//upper upper right
00060         LCD_2D.drawPixel(xc+x, yc-y, fgColor, bgColor);//upper right right
00061         LCD_2D.drawPixel(xc-x, yc+y, fgColor, bgColor);//lower left left
00062         LCD_2D.drawPixel(xc-y, yc+x, fgColor, bgColor);//lower lower left
00063         LCD_2D.drawPixel(xc+y, yc+x, fgColor, bgColor);//lower lower right
00064         LCD_2D.drawPixel(xc+x, yc+y, fgColor, bgColor);//lower right right
00065         if (p < 0) p += 4*(x++) + 6; 
00066         else p += 4*((x++) - y--) + 10; 
00067      } 
00068 }
00069 
00070 void Draw2D::drawRectangle(int x0, int y0, int x1, int y1, int fgColor, int bgColor)
00071 {
00072     int x,y, tmp;
00073     if (x0>x1) { tmp = x1; x1 = x0; x0 = tmp; }
00074     if (y0>y1) { tmp = y1; y1 = y0; y0 = tmp; }
00075     for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y0,fgColor, bgColor);
00076     for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x0,y,fgColor, bgColor);
00077     for (x=x0; x<=x1; x++) LCD_2D.drawPixel(x,y1,fgColor, bgColor);
00078     for (y=y0; y<=y1; y++) LCD_2D.drawPixel(x1,y,fgColor, bgColor);       
00079 }
00080 
00081 void Draw2D::drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, int fgColor, int bgColor)
00082 {
00083     drawLine(x0, y0, x1, y1, fgColor, bgColor);
00084     drawLine(x1, y1, x2, y2, fgColor, bgColor);
00085     drawLine(x0, y0, x2, y2, fgColor, bgColor);
00086 }
00087