Got (base 10) #ScientificNotation numeric display working with log-domain (base 2) input (so that exponent is not limited by single precision floating point). I just need to finish up adding minus sign support for the exponent (it can go negative)...

Show thread

Made a #timer as an #OpenGL #GLSL fragment #shader (function from (x, y, t) to colour).

Oriented box signed distance function from Inigo Quilez:

https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm

Segments activated by a load of conditionals on each digit's value.

Digits found by repeated divmod 10 stuff, after multiplying by 10000 (sets maximum number of digits after the point).

Leading zeros stripped with a simple loop (that stops at the point). I have code to strip trailing zeros too, but changing values are seldom affected.

Anti-aliasing of the decimal point seems to be a bit off, looks a bit too blurry. Want to add an option to move it to the baseline too.

Currently there are controls for glyph size, point size, segment length, segment thickness, foreground and background colours.

Eventual aim is to port the number rendering to the zoom video assembler I've been working on, to display zoom depth. Will need some extra fiddling, as that needs to be in log-domain and expanded to scientific notation without overflow.

Need to add motion blur to the zoom assembler first, otherwise the least significant digits will be too stroboscopic.

I made a #fractal #zoom #seamless #loop thing. Formula is Mandelbrot set modified to have power 2.005 instead of 2, coloured with additive blending of an orbit trap on the negative real axis (cycling between red, green, blue depending on iteration number).

The center point of the zoom is preperiodic point with preperiod 645 and period 12 (this fact was used to refine the coordinates to be more precise). Iteration count was 3000.

The zoom factor for the loop (both rotation and scaling) was found by overlaying two copies and fiddling with sliders until it lined up again.

Probably too much motion blur and not enough samples for anti-aliasing (256 per pixel), but it took almost 2 hours to render this 2 second thing...

the boundary conditions also constrain it within the frame. can also add additional constraints, like the hole in this one. obvious next step is reading a mask from a bitmap graphic file instead of defining it with code.

Show thread

Part of the algorithm is solving the Laplace equation for electric field strength. I do this by repeatedly applying boundary conditions, blurring, and normalizing. Typically I do 16 or more iterations of this between each next point selection and plotting, because when doing only 2 the image looks weird. But I somehow like the effect, not sure how to control it better...

Show thread

tweaked some parameters and it went all weird - this one adds (alpha * (number of boundary pixels) ^ beta) new points each step, with alpha = 0.5 and beta = 0.25.

Show thread

something went bad in this one (power 10), don't know why the thicker vertical/horizontal lines are there... they're not there in the previous image with 1/2 the iterations, but the texture is not so full....

Show thread

./ts i.wav o.wav

#include <complex.h>

#include <math.h>

#include <sndfile.h>

#include <fftw3.h>

#define C 2

#define F 65536

#define A 2048

#define J 1

#define O (A/4)

double w[A],a[A][C],b[A][C];double _Complex p[F],q[F],r[C][F],u[C][F],v[C][F];int main(int K,char**V){SF_INFO m={0};SNDFILE*f=sf_open(V[1],SFM_READ,&m);SF_INFO n={0,m.samplerate,m.channels,SF_FORMAT_WAV|SF_FORMAT_FLOAT,0,0};SNDFILE*g=sf_open(V[2],SFM_WRITE,&n);fftw_plan T=fftw_plan_dft_1d(F,p,q,FFTW_FORWARD,FFTW_PATIENT|FFTW_DESTROY_INPUT);fftw_plan S=fftw_plan_dft_1d(F,q,p,FFTW_BACKWARD,FFTW_PATIENT|FFTW_DESTROY_INPUT);for(int i=0;i<A;++i)w[i]=(0.5-0.5*cos(6.283185307179586*i/A))*8.2e-3;for(int c=0;c<C;++c)for(int i=0;i<F;++i){r[c][i]=0;u[c][i]=0;v[c][i]=1;}while(A==sf_readf_double(f,&a[0][0],A)){sf_seek(f,J-A,SEEK_CUR);for(int c=0;c<C;++c){for(int i=0;i<A;++i){if(i<A-O)b[i][c]=b[i+O][c];else b[i][c]=0;}for(int i=0;i<A;++i)p[i]=w[i]*a[i][c];for(int i=A;i<F;++i)p[i]=0;fftw_execute(T);for(int i=0;i<F;++i){r[c][i]=u[c][i];u[c][i]=q[i];double _Complex l0=u[c][i]/r[c][i];l0/=cabs(l0);double _Complex l=l0;for(int s=O/J;s>1;s>>=1)l*=l;v[c][i]*=l;v[c][i]/=cabs(v[c][i]);if(v[c][i]==0||!(v[c][i]==v[c][i])||isinf(cabs(v[c][i])))v[c][i]=1;q[i]=cabs(u[c][i])*v[c][i];}fftw_execute(S);for(int i=0;i<A;++i)b[i][c]+=w[i]*p[i];}sf_writef_double(g,&b[0][0],O);}return 0;}

making art with maths and algorithms

Joined May 2018