From b85f911e3e4e8ba837d55cf79a8af395fcf1b3d6ccad3e951650371a9c2a2fd2 Mon Sep 17 00:00:00 2001 From: dxrknesss Date: Wed, 5 Nov 2025 13:54:55 +0200 Subject: [PATCH] batman --- .clangd | 6 +++ main | Bin 0 -> 16136 bytes main.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 .clangd create mode 100755 main create mode 100644 main.c diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..f51586f --- /dev/null +++ b/.clangd @@ -0,0 +1,6 @@ +CompileFlags: + Add: + - "-std=c23" + - "-xc" + Remove: + - "-std=c++*" diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000000000000000000000000000..7811caf5151d83568e4eca8500de78ecc1ce0914c7b38ad01616ed1539955411 GIT binary patch literal 16136 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 D4z=8l literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..39db739 --- /dev/null +++ b/main.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include + +float noise(float x, float y); +float linear_interpolation(float a, float b, float t); +float quintic_curve(float t); +float dot_product(float a[], float b[]); +float *pseudo_random_gradient_vector_get(float x, float y); + +static unsigned char random_bytes[1024]; + +int main() { + int n = getrandom(random_bytes, 1024, 0); + if (n != 1024) { + fprintf(stderr, "err: getrandom didn't work out as planned\n"); + return 1; + } + + int width = 1024, height = 1024; + + png_image img; + memset(&img, 0, sizeof(img)); + img.format = PNG_FORMAT_GRAY; + img.width = width; + img.height = height; + img.version = PNG_IMAGE_VERSION; + + unsigned char *buffer; + printf("PNG IMAGE SIZE: %u\n", PNG_IMAGE_SIZE(img)); + buffer = malloc(PNG_IMAGE_SIZE(img)); + + for (int x = 0; x < height; ++x) { + for (int y = 0; y < width; ++y) { + float noise_val = noise(x * 0.05, y * 0.05); + unsigned char pixel = (unsigned char)((noise_val + 1.0f) * 127.5f); + + buffer[y + x * width] = pixel; + } + } + + png_image_write_to_file(&img, "noise.png", 0, buffer, 0, NULL); + + free(buffer); +} + +float noise(float x, float y) { + int left = floorf(x); + int top = floorf(y); + + float point_in_quad_x = x - left; + float point_in_quad_y = y - top; + + float *top_left_gradient = pseudo_random_gradient_vector_get(left, top); + float *top_right_gradient = pseudo_random_gradient_vector_get(left + 1, top); + float *bottom_left_gradient = + pseudo_random_gradient_vector_get(left, top + 1); + float *bottom_right_gradient = + pseudo_random_gradient_vector_get(left + 1, top + 1); + + float distance_to_top_left[] = {point_in_quad_x, point_in_quad_y}; + float distance_to_top_right[] = {point_in_quad_x - 1, point_in_quad_y}; + float distance_to_bottom_left[] = {point_in_quad_x, point_in_quad_y - 1}; + float distance_to_bottom_right[] = {point_in_quad_x - 1, point_in_quad_y - 1}; + + float tx1 = dot_product(distance_to_top_left, top_left_gradient); + float tx2 = dot_product(distance_to_top_right, top_right_gradient); + float bx1 = dot_product(distance_to_bottom_left, bottom_left_gradient); + float bx2 = dot_product(distance_to_bottom_right, bottom_right_gradient); + + point_in_quad_x = quintic_curve(point_in_quad_x); + point_in_quad_y = quintic_curve(point_in_quad_y); + + float tx = linear_interpolation(tx1, tx2, point_in_quad_x); + float bx = linear_interpolation(bx1, bx2, point_in_quad_x); + float tb = linear_interpolation(tx, bx, point_in_quad_y); + + free(top_left_gradient); + free(top_right_gradient); + free(bottom_left_gradient); + free(bottom_right_gradient); + + return tb; +} + +float linear_interpolation(float a, float b, float t) { + return a + (b - a) * t; +} + +float quintic_curve(float t) { return t * t * t * (t * (t * 6 - 15) + 10); } + +float dot_product(float a[2], float b[2]) { return a[0] * b[0] + a[1] * b[1]; } + +float *pseudo_random_gradient_vector_get(float x, float y) { + float *a; + a = malloc(sizeof *a * 2); + + int xi = (int)x & 1023; + int yi = (int)y & 1023; + + int hash = random_bytes[(random_bytes[xi] + yi) & 1023]; + int v = hash & 3; + + switch (v) { + case 0: + a[0] = 1; + a[1] = 0; + break; + case 1: + a[0] = -1; + a[1] = 0; + break; + case 2: + a[0] = 0; + a[1] = 1; + break; + case 3: + a[0] = 0; + a[1] = -1; + break; + } + + return a; +}