← rauzy-gasket

Rauzy Gasket

Iterates the barycentric algorithm to give an image of the Rauzy Gasket.

Source

image.glsl

const float r3 = 1.7320508075688772;
const mat3 ex = mat3(1.,-1.,1.,1.,1.,-1.,-1.,1.,1.);

vec3 cartToBary(vec2 p) {
    float u = (1.0 + 2.0 * p.y) / 3.0;
    float v = (1.0 - p.y - r3 * p.x) / 3.0;
    float w = (1.0 - p.y + r3 * p.x) / 3.0;
    return vec3(u, v, w);
}

// Barycentric -> Cartesian
vec2 baryToCart(vec3 b) {
    float x = 0.5 * r3 * (b.z - b.y);
    float y = b.x - 0.5 * (b.y + b.z);
    return vec2(x, y);
}

vec3 fx(vec3 uv)
{
    vec3 nv = uv;
    nv.x = uv.x-uv.y-uv.z;
    nv = nv/uv.x;
    return nv;
}

vec3 fy(vec3 uv)
{
    vec3 nv = uv;
    nv.y = uv.y-uv.x-uv.z;
    nv = nv/uv.y;
    return nv;
}

vec3 fz(vec3 uv)
{
    vec3 nv = uv;
    nv.z = uv.z-uv.x-uv.y;
    nv = nv/uv.z;
    return nv;
}

float minV(vec3 uv)
{
    return min(min(uv.x,uv.y),uv.z);
}

const float cs = 1.3;

const vec3 coly = cs*vec3(1.,0.,0.);
const vec3 colx = cs*vec3(1.,1.,1.);
const vec3 colz = cs*vec3(0.,0.,1.);

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord/iResolution.xy-vec2(.5,.5);
    
    uv.x = uv.x*iResolution.x/iResolution.y;
    uv=uv*1.65;
    uv.y=uv.y+.25;
    
    vec3 bary = cartToBary(uv);
    
    vec4 col = vec4(0.,0.,0.,0.);
    vec3 uCol = colx;
    
    if(minV(bary) > 0.)
    {
        int steps = int(floor(iTime*iTime))+1;
        
        for(int i=0; i<steps; i++)
        {
            if(minV(fx(bary)) > 0.) { 
                bary = fx(bary);
                uCol = colx;
                }
            else if(minV(fy(bary)) > 0.) { 
                bary = fy(bary); 
                uCol = coly;
                }
            else if(minV(fz(bary)) > 0.) { 
                bary = fz(bary); 
                uCol = colz;
                }
            else { 
                bary = ex*bary;
                col = vec4((colx*bary.x+coly*bary.y+colz*bary.z)/(log(log(float(i+1))+1.)+1.), 1.);
                break; 
            }
        }
    }
    
    fragColor = col;
}