diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2024-04-20 02:43:17 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2024-04-20 02:43:17 -0400 |
| commit | 5cba5bc63de403c779fd4fa762216280d4396444 (patch) | |
| tree | f1c2da748ab8f5bd88b40d09cd617838257dfb23 /src/mandelbrot.c | |
| parent | 74c1057a1cea4ec5fc3a8f338b24af553cc83399 (diff) | |
reorganized src files
Diffstat (limited to 'src/mandelbrot.c')
| -rw-r--r-- | src/mandelbrot.c | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/src/mandelbrot.c b/src/mandelbrot.c deleted file mode 100644 index ee2585f..0000000 --- a/src/mandelbrot.c +++ /dev/null @@ -1,125 +0,0 @@ -#include <complex.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> - -#include "grids.h" - -/* - * Computes the number of iterations it takes for a point z0 to diverge - * if the return value is equal to max_iterations, the point lies within the mandelbrot set - * This is an implementation the escape algorithm - */ -size_t mandelbrot(const double complex z0, const size_t max_iterations) { - double complex z = z0; - size_t iteration = 0; - - while (cabs(z) <= 2 && iteration < max_iterations) { - z = z * z + z0; - iteration++; - } - return iteration; -} - -/* - * Computes the number of iterations it takes for a point z0 to diverge - * if the return value is equal to max_iterations, the point lies within the multibrot set - * This is implementation closely matches mandelbrot - * Note, only positive integer powers are supported - */ -size_t multibrot(const double complex z0, const size_t max_iterations, const uintmax_t d){ - double complex z = z0; - double complex ztemp; - size_t iteration = 0; - while(cabs(z) <= 2 && iteration < max_iterations){ - ztemp = z; - for(size_t i = 0; i < d; i ++){ - ztemp *= ztemp; - } - z = ztemp + z0; - iteration++; - } - return iteration; -} - -/* - * Computes ????? for a julia set - * implementation of https://en.wikipedia.org/wiki/Julia_set#Pseudocode - */ -size_t julia(const double R, const double complex z0, const double complex c, const size_t max_iterations){ - //FIXME: I'm notsure if this is currently implemented correctly - if(R*R - R >= cabs(z0)) return 0; - double complex z = z0; - - size_t iteration = 0; - while(cabs(z) < R && iteration < max_iterations){ - z = z * z + c; - iteration++; - } - return iteration; -} - -/* - * Converts a grid point into an complex number - */ -double complex lattice_to_complex(const size_t index, const size_t x_res, const size_t y_res) { - const double x_min = -2.0; - const double x_max = 2.0; - const double y_min = -2.0; - const double y_max = 2.0; - - const double x_step = (x_max - x_min) / (double)x_res; - const double y_step = (y_max - y_min) / (double)y_res; - - const size_t x_index = index % x_res; - const size_t y_index = index / x_res; - - const double x = x_min + x_index * x_step; - const double y = y_min + y_index * y_step; - - return x + y * I; -} - - -int main(const int argc, char *argv[]) { - //default values - size_t iterations = 1000; - size_t x_res = 100; - size_t y_res = 100; - - //parse command line arguments - int opt; - while((opt =getopt(argc, argv, "i:x:y:")) != -1){ - switch(opt){ - case 'i': - iterations = strtoull(optarg, NULL, 10); - break; - case 'x': - x_res = strtoull(optarg, NULL, 10); - break; - case 'y': - y_res = strtoull(optarg, NULL, 10); - break; - default: - fprintf(stderr, "Usage: %s [-i iterations] [-x x_res] [-y y_res]\n", argv[0]); - return 1; - } - } - - - grid_t* grid = create_grid(x_res, y_res); - if(!grid) return 1; - - - const size_t size = grid->size; - size_t* data = grid->data; - for(size_t i = 0; i < size;i++){ - data[i] = multibrot(lattice_to_complex(i, x_res, y_res), iterations, 3); - } - - for(size_t i = 0; i < size; i++){ - printf("%zu%s", data[i], (i % x_res == x_res - 1) ? "\n" : "\t"); - } -} |
