Number of moving circles:

This text is displayed if your browser does not support HTML5 Canvas.

Octave/MATLAB code for experimentation:

Contents of file steiner.m:

function steiner(n, k, L, phi)
    s = sin(pi/n);
    b = s / (1 + s);
    a = 1 - b;
    r = a - b;
    circSpec = zeros(n+2, 3);
    phiStep = 2*pi/n;
    ang = linspace(-pi, pi, 1001);
    ca = cos(ang);
    sa = sin(ang);
    figure(1);
    plot(ca, sa, 'b', r*ca, r*sa, 'k');
    rho = L;
    s = k;
    den = rho*rho - s*s;
    circSpec(1, :) = [rho/den, 0, s/den];
    s = k*r;
    den = rho*rho - s*s;
    circSpec(2, :) = [rho/den, 0, s/den];
    hold on;
    for idx = 1:n
        cp = cos(phi);
        sp = sin(phi);
        cx = a*cp; 
        cy = a*sp;
        x0 = L + k * cx;
        y0 = k * cy;
        rho = norm([y0, x0]);
        salph = y0 / rho;
        calph = x0 / rho;
        s = k*b;
        den = rho*rho - s*s;
        rho = rho/den;
        circSpec(idx+2, :) = [calph*rho, salph*rho, s/den];
        plot(cx + b*ca, cy + b*sa, 'g');
        phi = phi + phiStep;
    end
    hold off;
    axis('equal');
    grid on;
    figure(2);
    x = circSpec(1,1) + circSpec(1,3)*ca;
    y = circSpec(1,2) + circSpec(1,3)*sa;
    plot(x, y, 'b');
    hold on;
    x = circSpec(2,1) + circSpec(2,3)*ca;
    y = circSpec(2,2) + circSpec(2,3)*sa;
    plot(x, y, 'k');
    for idx = 1:n
        x = circSpec(idx+2, 1) + circSpec(idx+2, 3)*ca;
        y = circSpec(idx+2, 2) + circSpec(idx+2, 3)*sa;
        plot(x, y, 'g');
    end
    hold off;
    axis('equal');
    grid on;