From f27a84cee4e5a6940dfb2c042538e1dce02263e8 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Mon, 31 Mar 2025 00:44:48 -0500 Subject: [PATCH] fixed point arithmatic done --- recon/screen_tests_c/.gdb_history | 8 +++++ recon/screen_tests_c/backup.c | 4 ++- recon/screen_tests_c/main.c | 58 ++++++++++++++++++------------ recon/screen_tests_c/mandelbrot | Bin 21560 -> 21624 bytes 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/recon/screen_tests_c/.gdb_history b/recon/screen_tests_c/.gdb_history index 4af8431..88dec06 100644 --- a/recon/screen_tests_c/.gdb_history +++ b/recon/screen_tests_c/.gdb_history @@ -15,3 +15,11 @@ print (int)GetKeyPressed() print (int)GetKeyPressed() print (int)GetKeyPressed() exit +break 117 +r +print z_r_2 +c +print z_r_2 +c +print z_r_2 +exit diff --git a/recon/screen_tests_c/backup.c b/recon/screen_tests_c/backup.c index 856e0f2..1a843d6 100644 --- a/recon/screen_tests_c/backup.c +++ b/recon/screen_tests_c/backup.c @@ -46,7 +46,9 @@ int main() { struct camera cam = { .min_r = -1, .max_r = 1, - .min_i = -1, + + yru += di*(targety - yru)/10.; + } .min_i = -1, .max_i = 1 }; InitWindow(RES_X, RES_Y, "mandelbrot fixed point test"); diff --git a/recon/screen_tests_c/main.c b/recon/screen_tests_c/main.c index 9c936e4..d77ecfb 100644 --- a/recon/screen_tests_c/main.c +++ b/recon/screen_tests_c/main.c @@ -5,22 +5,25 @@ #include #include -#define RES_X 160 -#define RES_Y 80 +#define RES_X 1600 +#define RES_Y 800 #define DEFAULT_CENTER_X 0 #define DEFAULT_CENTER_Y 0 #define MOUSE_BUTTON 0 #define STEP_SIZE .25 #define ZOOM_SIZE .25 + +#define DECIMAL_LOC 28 +#define DOUBLE_SCALER (1 << DECIMAL_LOC) +#define DOUBLE_TO_FIXED(val) (int32_t)((val) * DOUBLE_SCALER) +#define FIXED_MULTIPLY(x,y) ((((uint64_t)(x))*(y)) >> DECIMAL_LOC) +#define FIXED_TO_DOUBLE(val) ((val) / (double)DOUBLE_SCALER) + #define INFTY 2 #define INFTY_SQR INFTY * INFTY #define ITERS 255 - -#define DECIMAL_LOC 26 -#define DOUBLE_SCALER (1 << DECIMAL_LOC) -#define DOUBLE_TO_FIXED(val) (uint32_t)(val << DECIMAL_LOC) -#define FIXED_MULTIPLY(x,y) ((uint64_t)(x)*(y)) >> DECIMAL_LOC +#define INFTY_SQR_FIXED DOUBLE_TO_FIXED(INFTY_SQR) struct camera { @@ -47,7 +50,6 @@ void zoom_cam(struct camera *cam, double zoom) { } int main() { - int key_pressed; Color *pixels = malloc(RES_X * RES_Y * sizeof(Color)); struct camera cam = { .min_r = -1, @@ -63,6 +65,8 @@ int main() { Texture tex = LoadTextureFromImage(img); UnloadImage(img); + SetTargetFPS(10); + while(!WindowShouldClose()) { switch(GetKeyPressed()) { case KEY_UP: @@ -91,31 +95,41 @@ int main() { break; } printf("(%f, %f) - (%f, %f)\n", cam.min_r, cam.min_i, cam.max_r, cam.max_i); + printf("HERE -> %f, %f\n", 2.3 * 3.4, FIXED_TO_DOUBLE( + FIXED_MULTIPLY( + (DOUBLE_TO_FIXED(2.3)), (DOUBLE_TO_FIXED(3.4)) + ))); { //double scale_i = (cam.max_i - cam.min_i) / (double)GetRenderHeight(); //double scale_r = (cam.max_r - cam.min_r) / (double)GetRenderWidth(); - double scale_i = (cam.max_i - cam.min_i) / (double)RES_Y; - double scale_r = (cam.max_r - cam.min_r) / (double)RES_X; - double c_i = cam.max_i; - double c_r; - double z_i; - double z_r; - double zn_r, zn_i; - int i; + int32_t scale_i = DOUBLE_TO_FIXED((cam.max_i - cam.min_i) / (double)RES_Y); + int32_t scale_r = DOUBLE_TO_FIXED((cam.max_r - cam.min_r) / (double)RES_X); + int32_t c_i = DOUBLE_TO_FIXED(cam.max_i); + int32_t c_r, z_i, z_r, zn_i, zn_r; + int32_t z_r_2, z_i_2; uint8_t color; + + printf("%f, %f\n", FIXED_TO_DOUBLE(scale_r), (cam.max_r - cam.min_r) / (double)RES_X); + + int i; + int max = 0; for(int y = 0; y < RES_Y; y++) { - c_r = cam.min_r; + c_r = DOUBLE_TO_FIXED(cam.min_r); for(int x = 0; x < RES_X; x++) { z_i = 0; z_r = 0; for(i = 0; i < ITERS; i++) { - zn_r = pow(z_r, 2.0) - pow(z_i, 2.0) + c_r; - zn_i = (2.0 * z_r * z_i) + c_i; + z_r_2 = FIXED_MULTIPLY(z_r, z_r); + z_i_2 = FIXED_MULTIPLY(z_i, z_i); + + zn_r = z_r_2 - z_i_2 + c_r; + + zn_i = (FIXED_MULTIPLY((DOUBLE_TO_FIXED(2)), (FIXED_MULTIPLY(z_r, z_i)))) + c_i; + z_i = zn_i; z_r = zn_r; - if((pow(z_i, 2.0) + pow(z_r, 2.0)) > INFTY_SQR) { - break; - } + + if(z_i_2 + z_r_2 > INFTY_SQR_FIXED) break; } color = ((float)i / ITERS) * UINT8_MAX; pixels[((y * RES_X) + x)] = (Color){color, color, color, 255}; diff --git a/recon/screen_tests_c/mandelbrot b/recon/screen_tests_c/mandelbrot index 0c32b5b7e52881e2f14d0b749ef0fbd801584119..708131cd980c8efdc25b54d9e9af7a5665973f98 100755 GIT binary patch delta 5006 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