Thread

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