Nuvoton
/
NuMaker-mbed-I2C1_LCD_movingcircle
NuMaker-PFM-NUC472: I2C1 LCD draw a moving circle
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Wed Jul 20 2022 17:53:20 by 1.7.2