# mathr / blog / #

## Recursive star polygons

I drew the image above last August. Yesterday I translated it into GLSL source code in Fragmentarium and generalized it to different numbers of points and points to skip when forming the star:

#extension GL_EXT_gpu_shader4 : enable

#include "Progressive2D.frag"

#group Star
uniform int Points; slider[5,8,16]
uniform int Stride; slider[2,3,7]

const int depth = 128;
const float pi = 3.141592653;

float a = pi / float(Points);
float R = 1.0;
float r = R * cos(a * float(Stride));
float f = r / cos(a);
mat2 rot = mat2(cos(a), sin(a), -sin(a), cos(a));

bool clockwise(vec2 a, vec2 b, vec2 c) {
return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x) < 0.0;
}

vec3 color(vec2 p) {
vec2 z = p.yx;
bool inside = (Stride & 1) != 1;
for (int i = 0; i < depth; ++i) {
if (length(z) < f) {
z /= f;
if ((Stride & 1) != 1) {
z *= rot;
inside = !inside;
}
} else if (length(z) < R) {
for (int j = 0; j < Points; ++j) {
float a0 = 2.0 * float(j) * a;
float a1 = 2.0 * float(j + Stride) * a;
vec2 p0 = R * vec2(cos(a0), sin(a0));
vec2 p1 = R * vec2(cos(a1), sin(a1));
if (clockwise(p0, p1, z)) {
inside = !inside;
}
}
break;
} else {
inside = true;
break;
}
}
return vec3(inside ? 1.0 : 0.0);
}

They look like this: