100 lines
1.9 KiB
C
100 lines
1.9 KiB
C
/*
|
|
Computes and displays the Mandelbrot set on the OLED display.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifdef __linux__
|
|
#include <unistd.h>
|
|
#else
|
|
#include "io.h"
|
|
#endif
|
|
|
|
#define W 46
|
|
#define H 46
|
|
|
|
#define mandel_shift 10
|
|
#define mandel_mul (1 << mandel_shift)
|
|
#define xmin -2*mandel_mul
|
|
#define ymax 2*mandel_mul
|
|
#define ymin -2*mandel_mul
|
|
#define xmax 2*mandel_mul
|
|
#define dx (xmax-xmin)/H
|
|
#define dy (ymax-ymin)/H
|
|
#define norm_max (4 << mandel_shift)
|
|
|
|
|
|
#define ANSIRGB(R,G,B) "\033[48;2;" #R ";" #G ";" #B "m "
|
|
|
|
|
|
const char* colormap[21] = {
|
|
ANSIRGB( 0, 0, 0),
|
|
ANSIRGB( 0, 0, 40),
|
|
ANSIRGB( 0, 0, 80),
|
|
ANSIRGB( 0, 0,120),
|
|
ANSIRGB( 0, 0,160),
|
|
ANSIRGB( 0, 0,200),
|
|
ANSIRGB( 0, 0,240),
|
|
|
|
ANSIRGB( 0, 0, 0),
|
|
ANSIRGB( 0, 40, 0),
|
|
ANSIRGB( 0, 80, 0),
|
|
ANSIRGB( 0,120, 0),
|
|
ANSIRGB( 0,160, 0),
|
|
ANSIRGB( 0,200, 0),
|
|
ANSIRGB( 0,240, 0),
|
|
|
|
ANSIRGB( 0, 0, 0),
|
|
ANSIRGB( 40, 0, 0),
|
|
ANSIRGB( 80, 0, 0),
|
|
ANSIRGB( 120, 0, 0),
|
|
ANSIRGB( 160, 0, 0),
|
|
ANSIRGB( 200, 0, 0),
|
|
ANSIRGB( 240, 0, 0)
|
|
};
|
|
|
|
int main() {
|
|
int frame=0;
|
|
for(;;) {
|
|
IO_OUT(IO_LEDS,frame);
|
|
int last_color = -1;
|
|
printf("\033[H");
|
|
int Ci = ymin;
|
|
for(int Y=0; Y<H; ++Y) {
|
|
int Cr = xmin;
|
|
for(int X=0; X<W; ++X) {
|
|
int Zr = Cr;
|
|
int Zi = Ci;
|
|
int iter = 20;
|
|
while(iter > 0) {
|
|
int Zrr = (Zr * Zr) >> mandel_shift;
|
|
int Zii = (Zi * Zi) >> mandel_shift;
|
|
int Zri = (Zr * Zi) >> (mandel_shift - 1);
|
|
Zr = Zrr - Zii + Cr;
|
|
Zi = Zri + Ci;
|
|
if(Zrr + Zii > norm_max) {
|
|
break;
|
|
}
|
|
--iter;
|
|
}
|
|
int color = (iter+frame)%21;
|
|
printf(color == last_color ? " " : colormap[color]);
|
|
last_color = color;
|
|
Cr += dx;
|
|
}
|
|
Ci += dy;
|
|
printf("\033[49m\n");
|
|
last_color = -1;
|
|
}
|
|
++frame;
|
|
#ifdef __linux__
|
|
usleep(100000);
|
|
#endif
|
|
// if(frame>4) break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|