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;
}