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