Copied tricorn to tricorn_simd .h and .c files to be later modified into SIMD optimization. Changed converge definition to static in order to not have conflicts with other versions of the function as it is an internal helper function

This commit is contained in:
go38coz
2026-06-26 19:32:33 +02:00
parent 9e0ed163f8
commit ee2b6b9506
3 changed files with 58 additions and 2 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
#include "tricorn.h"
static const float convergenceLimit = 2.0f; // Mandelbrot set limit
unsigned converge(float complex position,unsigned n);
static unsigned converge(float complex position,unsigned n);
void tricorn(float complex start, size_t width, ssize_t height, float res, unsigned n, _Bool color, unsigned char* img){
@@ -34,7 +34,7 @@ void tricorn(float complex start, size_t width, ssize_t height, float res, unsig
}
// Iterative application of the equation given by the assignment
unsigned converge(float complex position,unsigned n){
static unsigned converge(float complex position,unsigned n){
complex float result = 0;
for(unsigned i = 0; i < n; i++){
+51
View File
@@ -0,0 +1,51 @@
#include "tricorn.h"
static const float convergenceLimit = 2.0f; // Mandelbrot set limit
static unsigned converge(float complex position,unsigned n);
void tricorn_simd(float complex start, size_t width, ssize_t height, float res, unsigned n, _Bool color, unsigned char* img){
// Absolute height for iteration purposes
height = height < 0 ? height*-1 : height;
// Simple iteration over every pixel in the picture
for(size_t i = 0; i < width; i++){
for(ssize_t j = 0; j < height; j++){
unsigned value = converge(start + (i*res - I*j*res),n);
// Pixel value position in the output array
size_t position = (j*width +i) *3;
if(!color){ // Grayscale colors as specified by the assignment r = g = b
img[position] = value;
img[position + 1] = value;
img[position + 2] = value;
}
else{ // Temporary colors with random multipliers
img[position] = ((value*3) % 255);
img[position + 1] = ((value*2) % 255) ;
img[position + 2] = ((value*5) % 255);
}
}
}
}
// Iterative application of the equation given by the assignment
static unsigned converge(float complex position,unsigned n){
complex float result = 0;
for(unsigned i = 0; i < n; i++){
// Application of the given complex equation with m = 2
result = cpowf(conjf(result),2) + position;
// Detection of unbounded behaviour
// If the magnitude of the result vector is greater than the convergence limit, we know that the function will grow unbounded
// Current convergence limit taken from mandelbrot set
if(sqrtf(powf (crealf(result),2)+powf(cimagf(result),2)) > convergenceLimit)
return 255-4*(i % 64);
}
return 0;
}
+5
View File
@@ -0,0 +1,5 @@
#include <complex.h>
#include <stddef.h>
#include <math.h>
#include <sys/types.h>
void tricorn_simd(float complex start, size_t width, ssize_t height, float res, unsigned n, _Bool color, unsigned char* img);