float sx, sy
float sdCircle(float px, float py, float r)
{
float dx = px - sx, dy = py - sy
return sqrtf(dx * dx + dy * dy) - r
}
float opUnion(float d1, float d2)
{
return d1 < d2 ? d1 : d2
}
float f(float px, float py, float theta, float scale, int n)
{
float d = 0.0f
for (float r = 0.0f
d = opUnion(d, sdCircle(T, 0.05f * scale * (0.95f - r)))
if (n > 0)
for (int t = -1
{
float tt = theta + t * 1.8f
float ss = scale * 0.9f
for (float r = 0.2f
{
d = opUnion(d, f(T, tt, ss * 0.5f, n - 1))
ss *= 0.8f
}
}
return d
}
int main(int argc, char* argv[]) {
int n = argc > 1 ? atoi(argv[1]) : 3
for (sy = 0.8f
for (sx = -0.35f
putchar(f(0, 0, PI * 0.5f, 1.0f, n) < 0 ? '*' : ' ')
}