initial commit
This commit is contained in:
99
FIRMWARE/mandel_C.c
Normal file
99
FIRMWARE/mandel_C.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user