You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.3 KiB
C

#include <stdint.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define VENTANA_ANCHO (1920*2)
#define VENTANA_ALTO (1080*2)
#define ANCHO VENTANA_ANCHO
#define ALTO VENTANA_ALTO
#define MAX_BAILOUT 50000
double xc = -0.5, yc = 0;
int bailout(double x0, double y0, double zoom) {
x0 = x0 * zoom + xc;
y0 = y0 * zoom + yc;
if(
(x0 > -1.2 && x0 <= -1.1 && y0 > -0.1 && y0 < 0.1)
|| (x0 > -1.1 && x0 <= -0.9 && y0 > -0.2 && y0 < 0.2)
|| (x0 > -0.9 && x0 <= -0.8 && y0 > -0.1 && y0 < 0.1)
|| (x0 > -0.69 && x0 <= -0.61 && y0 > -0.2 && y0 < 0.2)
|| (x0 > -0.61 && x0 <= -0.5 && y0 > -0.37 && y0 < 0.37)
|| (x0 > -0.5 && x0 <= -0.39 && y0 > -0.48 && y0 < 0.48)
|| (x0 > -0.39 && x0 <= 0.14 && y0 > -0.55 && y0 < 0.55)
|| (x0 > 0.14 && x0 < 0.29 && y0 > -0.42 && y0 < -0.07)
|| (x0 > 0.14 && x0 < 0.29 && y0 > 0.07 && y0 < 0.42)
) return MAX_BAILOUT;
double x = 0;
double y = 0;
int n = 0;
while(x*x + y*y <= 4 && n < MAX_BAILOUT) {
double xtemp = x*x - y*y + x0;
y = 2*x*y + y0;
x = xtemp;
n++;
}
return n;
}
unsigned int max(unsigned int m[ALTO][ANCHO]) {
unsigned int max = 0;
for(int i = 0; i < ALTO; i++)
for(int j = 0; j < ANCHO; j++)
if(m[i][j] > max)
max = m[i][j];
return max;
}
void computar_intensidad(unsigned int m500[ALTO][ANCHO], unsigned int m5000[ALTO][ANCHO], unsigned int m50000[ALTO][ANCHO], double x0, double y0, double zoom) {
x0 = x0 * zoom + xc;
y0 = y0 * zoom + yc;
double x = 0;
double y = 0;
int n = 0;
while(x*x + y*y <= 4 && n < MAX_BAILOUT) {
double xtemp = x*x - y*y + x0;
y = 2*x*y + y0;
x = xtemp;
int xx = (x - xc) / zoom + ANCHO / 2;
int yy = (y - yc) / zoom + ALTO / 2;
if(xx > 0 && xx < ANCHO && yy > 0 && yy < ALTO) {
if(n < 500)
m500[yy][xx]++;
if(n < 5000)
m5000[yy][xx]++;
m50000[yy][xx]++;
}
n++;
}
}
int main() {
double zoom = 1e-3;
float step = 0.1;
unsigned int (*m500)[ANCHO] = calloc(ANCHO * ALTO, sizeof(unsigned int));
unsigned int (*m5000)[ANCHO] = calloc(ANCHO * ALTO, sizeof(unsigned int));
unsigned int (*m50000)[ANCHO] = calloc(ANCHO * ALTO, sizeof(unsigned int));
for(double vy = -ALTO / 2; vy < ALTO / 2; vy += step)
for(double vx = - ANCHO / 2; vx < ANCHO / 2; vx += step) {
if(bailout(vx, vy, zoom) < MAX_BAILOUT)
computar_intensidad(m500, m5000, m50000, vx, vy, zoom);
}
int max500 = max(m500);
int max5000 = max(m5000);
int max50000 = max(m50000);
/* if(!max500) max500 = 1;
if(!max5000) max5000 = 1;
if(!max50000) max50000 = 1;*/
int mm = max500;
if(max5000 > mm)
mm = max5000;
if(max50000 > mm)
mm = max50000;
printf("P3\n%d %d\n%d\n", ALTO, ANCHO, mm);
for(int i = 0; i < ANCHO; i++)
for(int j = 0; j < ALTO; j++)
printf("%u %u %u\n",
m50000[j][i], //* 255 / max50000,
m5000[j][i], //* 255 / max5000,
m500[j][i] //* 255 / max500
);
return 0;
}