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
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;
|
|
}
|
|
|