From 039bef575547b29ad23c76b538128da641b6c0e9 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Fri, 27 May 2016 11:45:58 +1200 Subject: Initial roughing of custom image location, mandelbrot only --- algorithms/mandelbrot.c | 16 +++++++++------- fractal-gen.c | 26 +++++++++++++++++++++++++- fractal-gen.h | 8 ++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/algorithms/mandelbrot.c b/algorithms/mandelbrot.c index 67da2c6..51d0c43 100644 --- a/algorithms/mandelbrot.c +++ b/algorithms/mandelbrot.c @@ -31,19 +31,21 @@ void *generate_mandelbrot_section(void *section) { data_section *d = (data_section*)section; + struct frame *f = &(d->parent_frame); unsigned int x,y,i; double a,b; double complex z,c; - double size_units = 3.5f; - double top = -1.75f; - double left = -2.5f; + + defaultsd(&d->parent_frame.top, -1.75f); + defaultsd(&d->parent_frame.left, -2.5f); + defaultsd(&d->parent_frame.scale, 3.5f); /* FIXME document this */ - b = clust_id*(size_units/size)+top; /* FIXME document this */ + b = clust_id*(f->scale/size)+f->top; /* FIXME document this */ for (y = clust_id; y < size; y += clust_total) { - a = d->core*(size_units/size)+left; + a = d->core*(f->scale/size)+f->left; for (x = d->core; x < size; x += cores) { z = 0; c = a + I*b; @@ -54,9 +56,9 @@ void z = cpow(z , power) + c; } d->data[d->idx++] = (255*i)/iterat; - a += cores*(size_units/size); + a += cores*(f->scale/size); } - b += clust_total*(size_units/size); + b += clust_total*(f->scale/size); } return NULL; } diff --git a/fractal-gen.c b/fractal-gen.c index 0d2e1a3..c4be171 100644 --- a/fractal-gen.c +++ b/fractal-gen.c @@ -37,6 +37,8 @@ #include #include +struct frame f; + static struct section_generator generators[] = { { "mandelbrot-gen" , &generate_mandelbrot_section }, { "burning-ship-gen" , &generate_burning_ship_section }, @@ -48,6 +50,13 @@ char *ram_units[] = { }; +void +defaultsd(double *who, double def) +{ + if (isnan(*who)) + *who = def; +} + int main(int argc, char **argv) { @@ -129,8 +138,12 @@ main(int argc, char **argv) munmap(sections, sizeof(data_section)*cores); return 1; } + /* FIXME repetition */ sections[i].core = i; sections[i].width = width; + sections[i].parent_frame.top = f.top; + sections[i].parent_frame.left = f.left; + sections[i].parent_frame.scale = f.scale; sections[i].datasize = toalloc; fprintf(stderr, " -> Thread %lu\r", i); pthread_create(§ions[i].thread, NULL, generator, &(sections[i])); @@ -195,20 +208,31 @@ parse_args(int argc, char **argv) clust_id = 0; clust_total = 1; + f.left = nan(""); + f.top = nan(""); + f.scale = nan(""); + /* bail out early if no arguments are supplied */ if (argc <= 1) return 1; - while ( (opt = getopt(argc, argv, "s:i:e:c:t:N:T:")) != -1 ) { + while ( (opt = getopt(argc, argv, "s:i:e:c:t:N:T:x:y:z:")) != -1 ) { switch (opt) { case 's': size = atoi(optarg); break; case 'i': iterat = atoi(optarg); break; case 'e': power = atof(optarg); break; + case 'c': cores = atoi(optarg); break; case 't': thread_mult = atof(optarg); break; + case 'N': clust_id = atoi(optarg); break; case 'T': clust_total = atoi(optarg); break; + + case 'x': f.left = atof(optarg); break; + case 'y': f.top = atof(optarg); break; + case 'z': f.scale = atof(optarg); break; + /* redundant case for '?', but explicitness is best */ case '?': default: diff --git a/fractal-gen.h b/fractal-gen.h index 21d4ca5..a103d1f 100644 --- a/fractal-gen.h +++ b/fractal-gen.h @@ -28,8 +28,15 @@ #include #include +struct frame { + double top; + double left; + double scale; +}; + typedef struct { volatile unsigned long idx; + struct frame parent_frame; unsigned long core; unsigned long width; unsigned long datasize; @@ -48,6 +55,7 @@ char *argv0; typedef void* (*generator_func)(void *); +void defaultsd(double*, double); int parse_args(int argc, char **argv); generator_func select_generator(const char* name); void show_help(); -- cgit v1.1