La scheda impiegata e' stata una Arduino UNO
Il codice per la generazione dell'insieme e' riportata al termine del post. Di seguito invece il video in tempo reale. Considerando che questo schermo ha piu' o meno le dimensioni della schermata grafica di un Commodore 64 (anche se con un numero di colori maggiori) fa abbastanza pensare come un Commodore 64 agli inizi degli anni 90 impiegasse oltre 1 ora per lo stesso compito che una Arduino esegue in meno di tre minuti
----------------------------------------------------------------------
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
#define C0 0x00FF
#define C1 0x0F00
#define C2 0xF800
#define C3 0xF880
#define C4 0x8008
#define C5 0x8800
#define C6 0xFF00
#define C7 0xFFFF
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
float re_min = -2.0;
float im_min = -1.2;
float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 124;
float a,b;
float x,y,x_new,y_new;
int test;
int k,j,i;
#include "TFTLCD.h"
TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
void setup(void) {
tft.reset();
tft.initDisplay();
tft.fillScreen(0x0000);
//---------------------------------
float re_factor = (re_max-re_min);
float im_factor = (im_max-im_min);
for (i=0;i<SCREEN_HEIGHT;i++)
{
for (j=0;j<SCREEN_WIDTH;j++)
{
a = re_min+(j*re_factor/SCREEN_WIDTH);
b = im_min+(i*im_factor/SCREEN_HEIGHT);
x = 0;
y = 0;
test = 0;
for (k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
test = k;
switch (k%8)
{
case 0 : tft.drawPixel(i,j,C0); break;
case 1 : tft.drawPixel(i,j,C1); break;
case 2 : tft.drawPixel(i,j,C2); break;
case 3 : tft.drawPixel(i,j,C3); break;
case 4 : tft.drawPixel(i,j,C4); break;
case 5 : tft.drawPixel(i,j,C5); break;
case 6 : tft.drawPixel(i,j,C6); break;
case 7 : tft.drawPixel(i,j,C7); break;
}
break;
}
x = x_new;
y = y_new;
}
}
}
}
void loop(void) {
while (1) {}
}
Nessun commento:
Posta un commento