From 86385a8925b06564791b1c298bd5b56ef9948d57 Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Sat, 6 May 2023 13:03:43 +0900 Subject: [PATCH] julia: Add mandlebrot mode, explore mode --- apps/julia.c | 228 +++++++++++++++++++------ base/etc/panel.menu | 1 + base/usr/share/icons/48/mandelbrot.png | Bin 0 -> 11547 bytes util/createramdisk.py | 1 + 4 files changed, 176 insertions(+), 54 deletions(-) create mode 100644 base/usr/share/icons/48/mandelbrot.png diff --git a/apps/julia.c b/apps/julia.c index 5ba75a77..2fc708a7 100644 --- a/apps/julia.c +++ b/apps/julia.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,10 @@ #define GFX_(xpt, ypt) (GFX(ctx,xpt+decor_left_width,ypt+decor_top_height)) +static char * app_name = "Julia Fractals"; +static char * app_desc = "Julia fractal generator"; +static char * app_icon = "julia"; + /* Pointer to graphics memory */ static yutani_t * yctx; static yutani_window_t * window = NULL; @@ -40,16 +45,20 @@ static int decor_height = 0; /* Julia fractals elements */ -float conx = -0.752; /* real part of c */ -float cony = 0.117; /* imag part of c */ -float Maxx = 2; /* X bounds */ -float Minx = -2; -float Maxy = 1; /* Y bounds */ -float Miny = -1; -float pixcorx; /* Internal values */ -float pixcory; -float rotation = 4.1888; /* Blue */ +double conx = -0.752; /* real part of c */ +double cony = 0.117; /* imag part of c */ +double expx = 0.0; +double expy = 0.0; +double expz = 1.0; /* scale */ +double Maxx = 2; /* X bounds */ +double Minx = -2; +double Maxy = 1; /* Y bounds */ +double Miny = -1; +double pixcorx; /* Internal values */ +double pixcory; +double rotation = 4.1888; /* Blue */ int maxiter = 1000; /* Iteration levels */ +int explore_mode = 0; uint32_t * palette = NULL; @@ -157,9 +166,10 @@ int top = 40; int width = 300; int height = 300; + static uint32_t julia(int xpt, int ypt) { - long double x = xpt * pixcorx + Minx; - long double y = Maxy - ypt * pixcory; + long double x = (xpt * pixcorx + Minx) * expz + expx; + long double y = (Maxy - ypt * pixcory) * expz + expy; long double xnew = 0; long double ynew = 0; @@ -176,36 +186,60 @@ static uint32_t julia(int xpt, int ypt) { return palette[k]; } +static uint32_t mandelbrot(int xpt, int ypt) { + long double x0 = (xpt * pixcorx + Minx) * expz + expx; + long double y0 = (Maxy - ypt * pixcory) * expz + expy; + long double x = 0; + long double y = 0; + long double xnew = 0; + long double ynew = 0; + + int k = 0; + for (k = 0; k < maxiter; k++) { + xnew = x * x - y * y + x0; + ynew = 2 * x * y + y0; + x = xnew; + y = ynew; + if ((x * x + y * y) > 4.0) + break; + } + + return palette[k]; +} + +uint32_t (*function)(int,int) = julia; + #define T_I "\033[3m" #define T_N "\033[0m" void usage(char * argv[]) { printf( - "Julia fractal generator.\n" + "%s.\n" "\n" "usage: %s [-i " T_I "iterations" T_N "] [-x " T_I "minx" T_N "]\n" " [-X " T_I "maxx" T_N "] [-c " T_I "real" T_N "] [-C " T_I "imag" T_N "]\n" " [-W " T_I "width" T_N "] [-H " T_I "height" T_N "] [-h]\n" "\n" " -i --iterations " T_I "Number of iterations to run" T_N "\n" - " -x --minx " T_I "Minimum X value" T_N "\n" - " -X --maxx " T_I "Maximum X value" T_N "\n" + " -x --center-x " T_I "Center X" T_N "\n" + " -y --center-y " T_I "Center Y" T_N "\n" " -c --creal " T_I "Real component of c" T_N "\n" " -C --cimag " T_I "Imaginary component of c" T_N "\n" " -r --rotate " T_I "Hue rotation for color mapping" T_N "\n" " -W --width " T_I "Window width" T_N "\n" " -H --height " T_I "Window height" T_N "\n" " -h --help " T_I "Show this help message." T_N "\n", + app_desc, argv[0]); } static void decors() { - render_decorations(window, ctx, "Julia Fractals"); + render_decorations(window, ctx, app_name); flip(ctx); } static void do_line(gfx_context_t * ctx, int j) { for (int i = 0; i < width; ++i) { - GFX_(i,j) = julia(i,j); + GFX_(i,j) = function(i,j); } memcpy(&GFXR(ctx,0,decor_top_height+j),&GFX(ctx,0,decor_top_height+j),ctx->stride); yutani_flip_region(yctx, window, decor_left_width, decor_top_height + j, width, 1); @@ -220,8 +254,8 @@ static clock_t time_before; #define START_POINT -4 void start_processing(void) { - float _x = Maxx - Minx; - float _y = _x / width * height; + double _x = Maxx - Minx; + double _y = _x / width * height; Miny = 0 - _y / 2; Maxy = _y / 2; @@ -246,8 +280,39 @@ void start_processing(void) { void draw_label(void) { clock_t time_after = clock(); char description[100]; - snprintf(description, 100, "c = %g + %gi, %ld ms%s", conx, cony, (time_after - time_before) / 1000, step_n == 0 ? "*" : ""); - markup_draw_string(ctx, decor_left_width + 2, window->height - decor_bottom_height - 2, description, rgb(255,255,255)); + if (explore_mode) { + snprintf(description, 100, "x=%g y=%g, zoom=%g, %ld ms%s", expx, expy, expz, (time_after - time_before) / 1000, step_n == 0 ? "*" : ""); + } else { + snprintf(description, 100, "c = %g + %gi, %ld ms%s", conx, cony, (time_after - time_before) / 1000, step_n == 0 ? "*" : ""); + } + + /* Set up a clip box */ + gfx_context_t * tmp = init_graphics_subregion(ctx, decor_left_width, decor_top_height, width, height); + + /* Create a sprite to draw into */ + sprite_t * stmp = create_sprite(width, height, ALPHA_EMBEDDED); + gfx_context_t * sctx = init_graphics_sprite(stmp); + + /* Draw shadow */ + draw_fill(sctx, rgba(0,0,0,0)); + markup_draw_string(sctx, 2, height - 2, description, rgb(0,0,0)); + blur_context_box(sctx, 2); + blur_context_box(sctx, 2); + + /* Paint it twice */ + draw_sprite(tmp, stmp, 0, 0); + draw_sprite(tmp, stmp, 0, 0); + + /* Free the sprite part */ + free(sctx); + sprite_free(stmp); + + /* Now draw the white text */ + markup_draw_string(tmp, 2, height - 2, description, rgb(255,255,255)); + + /* Free clip space */ + free(tmp); + flip(ctx); yutani_flip(yctx,window); } @@ -276,7 +341,7 @@ void step_once(void) { for (int x = 0, i = 0; x < width; x += step_res, i++) { if ((step_n != START_POINT) && (step_i & 1) == 0 && (i & 1) == 0) continue; - uint32_t c = julia(x,step_y); + uint32_t c = function(x,step_y); for (int _y = 0; _y < step_res && _y + step_y < height; _y++) { for (int _x = 0; _x < step_res && _x + x < width; _x++) { GFX_(_x+x,_y+step_y) = c; @@ -318,9 +383,10 @@ void resize_finish(int w, int h) { yutani_flip(yctx, window); } -static double amount(struct yutani_msg_key_event * ke) { - double basis = 0.001; - +static double shift_amount = 0.001; +static double pan_amount = 0.1; +static double zoom_amount = 2.0; +static double amount(struct yutani_msg_key_event * ke, double basis) { if (ke->event.modifiers & (KEY_MOD_LEFT_SHIFT | KEY_MOD_RIGHT_SHIFT)) basis *= 10.0; if (ke->event.modifiers & (KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL)) basis *= 5.0; @@ -329,10 +395,19 @@ static double amount(struct yutani_msg_key_event * ke) { int main(int argc, char * argv[]) { + if (!strcmp(basename(argv[0]),"mandelbrot")) { + function = mandelbrot; + app_name = "Mandelbrot Explorer"; + app_desc = "Mandelbrot set plotter"; + app_icon = "mandelbrot"; + explore_mode = 1; + expx = -0.75; + } + static struct option long_opts[] = { {"iterations", required_argument, 0, 'i'}, - {"minx", required_argument, 0, 'x'}, - {"maxx", required_argument, 0, 'X'}, + {"center-x", required_argument, 0, 'x'}, + {"center-y", required_argument, 0, 'y'}, {"creal", required_argument, 0, 'c'}, {"cimag", required_argument, 0, 'C'}, {"rotate", required_argument, 0, 'r'}, @@ -358,10 +433,10 @@ int main(int argc, char * argv[]) { if (maxiter > 1000) maxiter = 1000; break; case 'x': - Minx = atof(optarg); + expx = atof(optarg); break; - case 'X': - Maxx = atof(optarg); + case 'y': + expy = atof(optarg); break; case 'c': conx = atof(optarg); @@ -408,7 +483,7 @@ int main(int argc, char * argv[]) { window = yutani_window_create(yctx, width + decor_width, height + decor_height); yutani_window_move(yctx, window, left, top); - yutani_window_advertise_icon(yctx, window, "Julia Fractals", "julia"); + yutani_window_advertise_icon(yctx, window, app_name, app_icon); ctx = init_graphics_yutani_double_buffer(window); @@ -439,30 +514,75 @@ int main(int argc, char * argv[]) { { struct yutani_msg_key_event * ke = (void*)m->data; if (ke->event.action == KEY_ACTION_DOWN) { - switch (ke->event.keycode) { - case 'q': - playing = 0; - break; - case KEY_ARROW_LEFT: - conx -= amount(ke); - needs_redraw = 1; - break; - case KEY_ARROW_RIGHT: - conx += amount(ke); - needs_redraw = 1; - break; - case KEY_ARROW_UP: - cony += amount(ke); - needs_redraw = 1; - break; - case KEY_ARROW_DOWN: - cony -= amount(ke); - needs_redraw = 1; - break; - case 'p': - next_palette(); - needs_redraw = 1; - break; + if (explore_mode) { + switch (ke->event.keycode) { + case KEY_ARROW_LEFT: + expx -= amount(ke, pan_amount) * expz; + needs_redraw = 1; + break; + case KEY_ARROW_RIGHT: + expx += amount(ke, pan_amount) * expz; + needs_redraw = 1; + break; + case KEY_ARROW_UP: + expy += amount(ke, pan_amount) * expz; + needs_redraw = 1; + break; + case KEY_ARROW_DOWN: + expy -= amount(ke, pan_amount) * expz; + needs_redraw = 1; + break; + case KEY_PAGE_UP: + expz /= amount(ke, zoom_amount); + needs_redraw = 1; + break; + case KEY_PAGE_DOWN: + expz *= amount(ke, zoom_amount); + needs_redraw = 1; + break; + case 'q': + playing = 0; + break; + case 'p': + next_palette(); + needs_redraw = 1; + break; + case 'e': + explore_mode = 0; + needs_redraw = 1; + break; + } + + } else { + switch (ke->event.keycode) { + case 'q': + playing = 0; + break; + case KEY_ARROW_LEFT: + conx -= amount(ke, shift_amount); + needs_redraw = 1; + break; + case KEY_ARROW_RIGHT: + conx += amount(ke, shift_amount); + needs_redraw = 1; + break; + case KEY_ARROW_UP: + cony += amount(ke, shift_amount); + needs_redraw = 1; + break; + case KEY_ARROW_DOWN: + cony -= amount(ke, shift_amount); + needs_redraw = 1; + break; + case 'p': + next_palette(); + needs_redraw = 1; + break; + case 'e': + explore_mode = 1; + needs_redraw = 1; + break; + } } } } diff --git a/base/etc/panel.menu b/base/etc/panel.menu index aa958af4..851035b7 100644 --- a/base/etc/panel.menu +++ b/base/etc/panel.menu @@ -17,6 +17,7 @@ exec terminal,utilities-terminal,Terminal exec drawlines,drawlines,Draw Lines :decorated exec julia,julia,Julia Fractals +exec mandelbrot,mandelbrot,Mandelbrot Explorer exec plasma,plasma,Plasma :settings exec gsudo package-manager,package,Package Manager diff --git a/base/usr/share/icons/48/mandelbrot.png b/base/usr/share/icons/48/mandelbrot.png new file mode 100644 index 0000000000000000000000000000000000000000..64e9a9d74a678d403fc7458c9e42bd2475d140f8 GIT binary patch literal 11547 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 Lx@?uSS;+qZ2Glu% literal 0 HcmV?d00001 diff --git a/util/createramdisk.py b/util/createramdisk.py index 6768f3dd..130f17f5 100644 --- a/util/createramdisk.py +++ b/util/createramdisk.py @@ -70,5 +70,6 @@ with tarfile.open('ramdisk.igz','w:gz') as ramdisk: ramdisk.add('util/auto-dep.krk',arcname='/bin/auto-dep.krk',filter=file_filter) ramdisk.add('kuroko/src/kuroko',arcname='/usr/include/kuroko',filter=file_filter) ramdisk.addfile(symlink('bin/sh','esh')) + ramdisk.addfile(symlink('bin/mandelbrot','julia'))