#include <stdio.h>
#include <omp.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define X_PIXEL 1000
#define Y_PIXEL 1000

static inline bool in_circle(double x, double y)
{
    return (x*x + y*y < 1.0);
}

double scaled_x(int x) {
    return -2.5 + (3.0 / X_PIXEL) * (double)x;
}

double scaled_y(int y) {
    return -2.0 + (4.0 / Y_PIXEL) * (double)y;
}

int main(int argc, const char *argv[])
{
    double start = omp_get_wtime();

    char picture[X_PIXEL][Y_PIXEL];
    for (int px = 0; px < X_PIXEL; px++) 
    for (int py = 0; py < Y_PIXEL; py++)
    {
        double cx = scaled_x(px); 
        double cy = scaled_y(py); 
        double x = 0.0;
        double y = 0.0;
        int i = 0;
        int max_i = 1000;
        while(i < max_i && x*x + y*y < (1 << 16)) 
        {
            double x_tmp = x*x - y*y + cx;
            double y_tmp = 2*x*y + cy;
            x = x_tmp;
            y = y_tmp;
            i++;
        }
        if (i == max_i) {
            picture[px][py] = '*';
        } else {
            picture[px][py] = ' ';
        }
    }

    double end = omp_get_wtime();

    // We downscale the image 
    // by only printing one in twenty pixels
    for (int x = 0; x < X_PIXEL; x+=20) {
        printf("\n");
        for (int y = 0; y < Y_PIXEL; y+=20)
            printf("%c", picture[x][y]);
    
    }

    printf("\nComputation took %f seconds\n", end - start);
}
