diff options
Diffstat (limited to 'src/fractals.c')
| -rw-r--r-- | src/fractals.c | 103 |
1 files changed, 88 insertions, 15 deletions
diff --git a/src/fractals.c b/src/fractals.c index b43ad0e..82e4ef6 100644 --- a/src/fractals.c +++ b/src/fractals.c @@ -2,17 +2,36 @@ #include <unistd.h> #include <stdlib.h> #include <sys/ioctl.h> +#include <getopt.h> #include "grids.h" #include "precision.h" #include "fractals.h" + +void print_usage(FILE* file, char* program_name){ + fprintf(file, "Usage: %s [-v] [-i iterations] [-x x_res] [-y y_res] [-z magnification] [-l lower_left] [-u upper_right]\n", program_name); +} + +void print_help(){ + //TODO: add help +} + +void print_info(){ + #ifdef EXTENDED_PRECISION + printf("Compiled with long double float precision\n"); + #endif + #ifndef EXTENDED_PRECISION + printf("Compiled with double float precision\n"); + #endif +} + int main(const int argc, char *argv[]) { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); //default values - size_t iterations = 1000; + size_t iterations = 100; size_t x_res = w.ws_col; size_t y_res = w.ws_row; CBASE re_lower_left = -2; @@ -21,10 +40,32 @@ int main(const int argc, char *argv[]) { CBASE im_upper_right = 2; CBASE magnification = 1; bool verbose = false; + bool print = false; + //TODO: allocate adequate size buffer + bool output_to_file = false; + char* output_filename = "fractal.grid"; + + // TODO: have output format option + // TODO: have output file + + + static struct option long_options[] = { + {"iterations", required_argument, NULL, 'i'}, + {"x-res", required_argument, NULL, 'x'}, + {"y-res", required_argument, NULL, 'y'}, + {"lower-left", required_argument, NULL, 'l'}, + {"upper-right", required_argument, NULL, 'u'}, + {"magnification", required_argument, NULL, 'z'}, + {"output", required_argument, NULL, 'o'}, + {"print", no_argument, NULL, 'p'}, + {"verbose", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {0, 0, 0, 0} // Termination element + }; //parse command line arguments int opt; - while((opt = getopt(argc, argv, "vhi:x:y:l:u:z:")) != -1){ + while((opt = getopt_long(argc, argv, "i:x:y:l:u:z:o:pvh", long_options, NULL)) != -1){ switch(opt){ case 'i': iterations = strtoull(optarg, NULL, 10); @@ -41,6 +82,13 @@ int main(const int argc, char *argv[]) { case 'u': sscanf(optarg, CFORMAT"+"CFORMAT"i", &re_upper_right, &im_upper_right); break; + case 'o': + //TODO: check if within length + //TODO: + break; + case 'p': + print = true; + break; case 'z': sscanf(optarg, CFORMAT, &magnification); if(magnification <= 0){ @@ -52,10 +100,10 @@ int main(const int argc, char *argv[]) { verbose = true; break; case 'h': - fprintf(stderr, "Usage: %s [-v] [-i iterations] [-x x_res] [-y y_res] [-z magnification] [-l lower_left] [-u upper_right]\n", argv[0]); + print_usage(stdout, argv[0]); return 0; default: - fprintf(stderr, "Usage: %s [-v] [-i iterations] [-x x_res] [-y y_res] [-z magnification] [-l lower_left] [-u upper_right]\n", argv[0]); + print_usage(stderr, argv[0]); return 1; } } @@ -72,21 +120,44 @@ int main(const int argc, char *argv[]) { zoom_grid(grid, magnification); } + // params for different fractals + const double degree = 3.0; + const CBASE complex constant = 0.285L + 0.01L*I; + // const CBASE complex constant = -0.835L -0.321L* I; + const double radius = 100; - //const long double complex c = 0.285L + 0.01L*I; - // const long double complex c = -0.835L -0.321L* I; - // const double R = 100; - // julia_grid(grid, iterations, c, R); - mandelbrot_grid(grid, iterations); - //multibrot_grid(grid, iterations, 3); + enum fractal f = MULTICORN; + switch(f){ + case MANDELBROT: + mandelbrot_grid(grid, iterations); + break; + case TRICORN: + tricorn_grid(grid, iterations); + break; + case MULTIBROT: + multibrot_grid(grid, iterations, degree); + break; + case MULTICORN: + multicorn_grid(grid, iterations, degree); + break; + case JULIA: + julia_grid(grid, iterations, constant, radius); + break; + default: + //TODO: update fractal type + fprintf(stderr, "Unrecognized fractal\n"); + return 1; + } if(verbose)print_grid_info(grid); - print_grid(grid, iterations); + if(print)print_grid(grid, iterations); - // //write grid to file - // FILE* write_file = fopen("test.grid", "wb"); - // write_grid(write_file , grid); - // fclose(write_file); + //write grid to file + if(output_to_file){ + FILE* write_file = fopen("test.grid", "wb"); + write_grid(write_file , grid); + fclose(write_file); + } // // //attempt to read grid from file // FILE* read_file = fopen("test2.grid", "rb"); @@ -94,4 +165,6 @@ int main(const int argc, char *argv[]) { // fclose(read_file); // // printf("Grids are %s equal\n", grid_equal(grid, grid2) ? "exactly" :"not exactly"); + + return 0; } |
