Wallpaper Groups
The 17 wallpaper groups — all possible ways to tile a plane with a repeating pattern. Shader implementations.
*632 (p6m)
vec2 mirror(vec2 uv, vec2 n, float d){
float s = dot(n, uv) + d;
return uv + n * (abs(s) - s);
}
vec2 p6m(vec2 uv){
float cos6 = 0.866033; // cos(3.1415/6.)
vec2 stp = vec2(1.5/cos6, 1.);
uv = abs(fract(uv / stp * .5) * 2. - 1.) * stp;
vec2 n3 = vec2(-cos6, -.5);
vec2 n2 = -vec2(.5, -cos6);
vec2 n1 = -vec2(cos6, -.5);
uv = mirror(uv, n3, 1.);
uv = mirror(uv, n2, 0.);
uv = mirror(uv, n1, 0.);
return uv;
}
442 (p4)
vec2 p4(vec2 uv){
vec2 id=floor(uv);
uv=fract(uv);
if(mod(floor(id.y),2.)==0.)uv.y=1.-uv.y;
if(mod(floor(id.x),2.)==0.)uv.x=1.-uv.x;
if(mod(id.x+id.y,2.)==0.)uv=uv.yx;
return uv;
}
4*2 (p4g)
vec2 p4g(vec2 uv){
vec2 id = floor(uv);
uv = fract(uv);
if((int(floor(id.y))&1)==0){uv.x=1.-uv.x;}
if((int(floor(id.x))&1)==0){uv.y=1.-uv.y;}
if(uv.x<uv.y)uv=uv.yx;
return uv;
}
22× (pgg)
vec2 pgg(vec2 uv){
vec2 id = floor(uv);
uv = fract(uv);
if(mod(floor(id.x) + floor(id.y), 2.) == 0.) uv = 1. - uv.yx;
if(uv.y > uv.x) uv = 1. - uv;
return uv;
}
2222 (p2)
vec2 p2(vec2 uv){
uv=fract(uv);
if(uv.y>uv.x){uv=1.-uv;}
return uv;
}
2*22 (cmm)
Reflections along both axes and 2-fold rotations on a centered rectangular lattice.
vec2 cmm(vec2 uv){
if((int(floor(uv.y/2.))&1)==0){uv.x=1.-uv.x;}
uv=abs(mod(uv,2.)-1.);
return uv;
}
22* (pmg)
vec2 pmg(vec2 uv){
float idy = floor(uv.y);
uv.y = fract(uv.y);
if(mod(floor(idy), 2.) == 0.) uv = 1. - uv;
uv.x = abs(fract(uv.x / 2.) * 2. - 1.);
return uv;
}
×× (pg)
vec2 pg(vec2 uv){
uv.x=fract(uv.x);
if(mod(floor(uv.y),2.)==0.)uv.x=1.-uv.x;
uv.y=fract(uv.y);
return uv;
}
*442 (p4m)
vec2 p4m(vec2 uv){
uv=abs(fract(uv*.5)*2.-1.);
if(uv.y>uv.x)uv=uv.yx;
return uv;
}