Example of using the DM-TFT18-101 display
Dependencies: DmTftLibrary mbed
Fork of dm_bubbles by
BubbleDemo.cpp
00001 /****************************************************************************** 00002 * Includes 00003 *****************************************************************************/ 00004 00005 #include "mbed.h" 00006 00007 #include "BubbleDemo.h" 00008 #include "DmTftBase.h" 00009 #include "wchar.h" 00010 00011 /****************************************************************************** 00012 * Typedefs and defines 00013 *****************************************************************************/ 00014 00015 #define PI 3.1415926535897932384626433832795 00016 00017 /* Red color mask, 565 mode */ 00018 #define REDMASK 0xF800 00019 /* Red shift value, 565 mode */ 00020 #define REDSHIFT 11 00021 /* Green color mask, 565 mode */ 00022 #define GREENMASK 0x07E0 00023 /* Green shift value, 565 mode */ 00024 #define GREENSHIFT 5 00025 /* Blue color mask, 565 mode */ 00026 #define BLUEMASK 0x001F 00027 /* Blue shift value, 565 mode */ 00028 #define BLUESHIFT 0 00029 00030 /* Number of colors in 565 mode */ 00031 #define NUM_COLORS 65536 00032 /* Number of red colors in 565 mode */ 00033 #define RED_COLORS 0x20 00034 /* Number of green colors in 565 mode */ 00035 #define GREEN_COLORS 0x40 00036 /* Number of blue colors in 565 mode */ 00037 #define BLUE_COLORS 0x20 00038 00039 /****************************************************************************** 00040 * Local variables 00041 *****************************************************************************/ 00042 00043 00044 /****************************************************************************** 00045 * External variables 00046 *****************************************************************************/ 00047 00048 00049 /****************************************************************************** 00050 * Local functions 00051 *****************************************************************************/ 00052 00053 00054 void BubbleDemo::initialize() { 00055 float radian; 00056 const float phase1 = 2 * PI / 3; 00057 const float phase2 = 4 * PI / 3; 00058 00059 for(i = 0; i < NumBalls; i++) { 00060 x[i] = this->windowX / 2; 00061 y[i] = this->windowY / 2; 00062 r[i] = i * 2 + 10; 00063 00064 oldX[i] = x[i]; 00065 oldY[i] = y[i]; 00066 00067 velX[i] = 1; 00068 velY[i] = 1; 00069 00070 radian = i * 2 * PI / NumBalls; 00071 red[i] = cos(radian) * RED_COLORS / 2 + (RED_COLORS / 2 - 1); 00072 green[i] = cos(radian + phase2) * GREEN_COLORS / 2 + (GREEN_COLORS / 2 - 1); 00073 blue[i] = cos(radian + phase1) * BLUE_COLORS / 2 + (BLUE_COLORS / 2 - 1); 00074 } 00075 } 00076 00077 void BubbleDemo::collision() { 00078 float disX = x[j] - x[i]; 00079 float disY = y[j] - y[i]; 00080 float d2 = disX * disX + disY * disY; 00081 00082 if(d2 != 0) { 00083 float rij = r[i] + r[j]; 00084 float rij2 = rij * rij; 00085 00086 if(d2 < rij2) { 00087 float ii = (disX * velX[i] + disY * velY[i]) / d2; 00088 float ji = (disX * velY[i] - disY * velX[i]) / d2; 00089 float ij = (disX * velX[j] + disY * velY[j]) / d2; 00090 float jj = (disX * velY[j] - disY * velX[j]) / d2; 00091 float ratio = rij / sqrt(d2); 00092 00093 velX[i] = ij * disX - ii * disY; 00094 velY[i] = ij * disY + ii * disX; 00095 velX[j] = ji * disX - jj * disY; 00096 velY[j] = ji * disY + jj * disX; 00097 00098 disX *= (ratio - 1) / 2; 00099 disY *= (ratio - 1) / 2; 00100 00101 x[j] += disX; 00102 y[j] += disY; 00103 x[i] -= disX; 00104 y[i] -= disY; 00105 } 00106 } 00107 } 00108 00109 void BubbleDemo::borders() { 00110 if(x[i] >= this->windowX - r[i] - 1) { 00111 x[i] = this->windowX - r[i] - 1; 00112 velX[i] = -velX[i]; 00113 } else if(x[i] <= r[i]) { 00114 x[i] = r[i]; 00115 velX[i] = -velX[i]; 00116 } 00117 00118 if(y[i] >= this->windowY - r[i] - 1) { 00119 y[i] = this->windowY - r[i] - 1; 00120 velY[i] = -velY[i]; 00121 } else if(y[i] <= r[i]) { 00122 y[i] = r[i]; 00123 velY[i] = -velY[i]; 00124 } 00125 } 00126 00127 void BubbleDemo::draw() { 00128 tft->drawCircle(oldX[i], oldY[i], r[i], BLACK); 00129 tft->drawCircle(x[i], y[i], r[i], (red[i] << REDSHIFT) + (green[i] << GREENSHIFT) + (blue[i] << BLUESHIFT)); 00130 00131 oldX[i] = x[i]; 00132 oldY[i] = y[i]; 00133 } 00134 00135 00136 /****************************************************************************** 00137 * Public functions 00138 *****************************************************************************/ 00139 00140 BubbleDemo::BubbleDemo(DmTftBase* display, uint16_t dispWidth, uint16_t dispHeight) { 00141 00142 this->windowX = dispWidth; 00143 this->windowY = dispHeight; 00144 tft = display; 00145 00146 initialize(); 00147 } 00148 00149 void BubbleDemo::run(uint32_t loops, uint32_t delayMs) { 00150 00151 tft->clearScreen(); 00152 00153 for(int32_t n=0;n<loops;n++) { 00154 00155 for(i = 0; i < NumBalls; i++) { 00156 x[i] += velX[i]; 00157 y[i] += velY[i]; 00158 00159 for(j = i + 1; j < NumBalls; j++) 00160 collision(); 00161 00162 borders(); 00163 00164 if((int)x[i] != (int)oldX[i] || (int)y[i] != (int)oldY[i]) 00165 draw(); 00166 } 00167 00168 wait_ms(delayMs); 00169 } 00170 }
Generated on Fri Jul 15 2022 12:32:15 by 1.7.2