Landtiger (LPC1768) graphics LCD demo.

Dependencies:   Tiger_LCD mbed

Dependents:   Tiger_LCD

See here for more info.

Julia.h

Committer:
wim
Date:
2015-10-30
Revision:
3:2dccfa0121de

File content as of revision 3:2dccfa0121de:

#define REAL_CONSTANT -0.35//0.285
#define IMG_CONSTANT  0.61//0.01

#define REAL_CONSTANT2 -0.4
#define IMG_CONSTANT2  0.6

#define REAL_CONSTANT3  -0.70176
#define IMG_CONSTANT3   0.3842

#define REAL_CONSTANT4  -0.835
#define IMG_CONSTANT4    0.2321

#define REAL_CONSTANT5 -0.8
#define IMG_CONSTANT5   0.156

#define REAL_CONSTANT6 -0.74543
#define IMG_CONSTANT6   0.11301

#define REAL_CONSTANT7 -0.75
#define IMG_CONSTANT7  0.11

#define REAL_CONSTANT8 -0.1
#define IMG_CONSTANT8   0.651


#define REAL_CONSTANT9 0.001643721971153
#define IMG_CONSTANT9  0.822467633298876

#define ITERATION    256


// rrrrrggggggbbbbb
#define ASSEMBLE_RGB(r,g,b) ((r & 0xF8)<<8) | ((g & 0xFC)<<3) | ((b & 0xF8)>>3)


typedef struct {
    float x, y;
} Complex; 

Complex complexSquare(Complex c){
    Complex cSq;
    cSq.x = c.x * c.x - c.y * c.y;
    cSq.y = 2 * c.x * c.y;
    return cSq;
} 

int iterate (Complex zInit, int maxIter){
    Complex z = zInit;
    int cnt = 0;
    while((z.x * z.x + z.y * z.y <= 4)&& (cnt < maxIter)){
        z = complexSquare(z);
        z.x += zInit.x;
        z.y += zInit.y;
        cnt++;
    }
    return cnt;
}

void mandelbrot(int nx, int ny, int maxIter, float realMin, float realMax, float imagMin, float imagMax){
    float realInc = (realMax - realMin) / nx;
    float imagInc = (imagMax - imagMin) / ny;
    int color =0;
    Complex z;
    int x, y;
    int cnt;
    for(x = 0, z.x = realMin; x < nx; x++, z.x += realInc)
       for(y = 0, z.y = imagMin; y < ny; y++, z.y += imagInc ){
            cnt = iterate(z, maxIter);
            if(cnt == maxIter)
                color = ASSEMBLE_RGB(0, 0, 0);
            else{
                color = ASSEMBLE_RGB(cnt*5, 15*cnt, cnt*3);
            }
            myGLCD.drawPixel(x, y, color);
       }
}






void Julia(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom, float constanta)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 8)) 
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + constanta ;//IMG_CONSTANT;
          num_real = tmp1 - tmp2 +constanta ;//REAL_CONSTANT;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(y,x,ASSEMBLE_RGB(i*1,i*2,i*3));
    }
  }
}

void Julia2(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT2;
          num_real = tmp1 - tmp2 + REAL_CONSTANT2;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*8,i*18,i*13));
    }
  }
}

void Julia3(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT3;
          num_real = tmp1 - tmp2 + REAL_CONSTANT3;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*12,i*38,i*18));
    }
  }
}

void Julia4(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT4;
          num_real = tmp1 - tmp2 + REAL_CONSTANT4;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*8,i*18,i*38));
    }
  }
}

void Julia5(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT5;
          num_real = tmp1 - tmp2 + REAL_CONSTANT5;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(256-i*8,256-i*18,256-i*38));
    }
  }
}

void Julia6(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT6;
          num_real = tmp1 - tmp2 + REAL_CONSTANT6;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*25,i*18,i*15));
    }
  }
}
void Julia7(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT7;
          num_real = tmp1 - tmp2 + REAL_CONSTANT7;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*8,i*5,i*38));
    }
  }
}
void Julia8(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img + IMG_CONSTANT8;
          num_real = tmp1 - tmp2 + REAL_CONSTANT8;
          radius = tmp1 + tmp2;
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*24,i*18,i*10));
    }
  }
}

void Julia9(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom)
{
  float tmp1, tmp2;
  float num_real, num_img;
  float radius;
  uint8_t i;
  uint16_t x,y;
  for (y=0; y<size_y; y++)
  {
    for (x=0; x<size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i=0;
      radius = 0;
      while ((i<ITERATION-1) && (radius < 4))
        {
          tmp1 = num_real * num_real;
          tmp2 = num_img * num_img;
          num_img = 2*num_real*num_img - IMG_CONSTANT9; //+
          num_real = tmp1 - tmp2 - REAL_CONSTANT9;  // -   +
          radius = tmp1 + tmp2; //+
          i++;
        }
      myGLCD.drawPixel(x,y,ASSEMBLE_RGB(i*8,i*18,i*38));
    }
  }
}