Example showing the use of displays from DisplayModule.com with the LPC4088 Experiment Base Board

Dependencies:   DmTftLibrary mbed

Fork of dm_bubbles by Display Module

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BubbleDemo.cpp Source File

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 }