Como he mencionado en los comentarios, los tamaños de las plazas son un poco más complicado de lo que usted está esperando. No sé de una simple expresión para el tamaño de cada cuadrado, pero usted puede obtener cada una por resolver una ecuación cuadrática. Yo escribí un programa para hacerlo; atrae todas las plazas cuyos tamaños están por encima de un pequeño umbral. Aquí está el resultado. Espero que ayude!
Los detalles sobre el programa: para un punto $(0,0)\leq(x,y)\leq(1,1)$, queremos encontrar una plaza con un vértice en $(x,y)$ y el otro en la esfera de $x_0^2+y_0^2=1$. Escrito $b=y-x$, la condición de que los dos puntos que forman un cuadrado significa que $y_0=x_0+b$. Sustituyendo, obtenemos $2x_0^2+2bx_0+b^2-1=0$. La solución está dada por la ecuación cuadrática: $x_0=\frac14\left(-2b+\sqrt{4b^2-4(2)(b^2-1)}\right)$ y, a continuación, nos dan $y_0$ de $y_0=x_0+b$. Ahora dibuja el cuadrado de entre $(x,y)$ y $(x_0,y_0)$ y repita el proceso de cada uno de los puntos $(x,y_0)$ y $(x_0,y)$.
Aquí un poco de código C++ para generar un SVG fragmento:
using namespace std;
void box(double x1, double y1, double x2, double y2, int level)
{
cout
<< "<rect x=\"" << min(x1, x2)
<< "\" y=\"" << min(y1, y2)
<< "\" width=\"" << abs(x1-x2)
<< "\" height=\"" << abs(y1-y2)
<< "\"";
switch (level % 3)
{
case 0: cout << " fill=\"red\""; break;
case 1: cout << " fill=\"green\""; break;
case 2: cout << " fill=\"blue\""; break;
}
cout << " />" << endl;
}
void boxes(double x1, double y1, double x2, double y2, int level)
{
double r = 300.0;
x1 *= r;
y1 *= r;
x2 *= r;
y2 *= r;
box(r+x1,r+y1,r+x2,r+y2, level);
box(r+x1,r-y1,r+x2,r-y2, level);
box(r-x1,r+y1,r-x2,r+y2, level);
box(r-x1,r-y1,r-x2,r-y2, level);
}
void advance(double x, double y, double& ox, double& oy)
{
const float b = y - x;
ox = (-2*b + sqrt(4*b*b - 8*(b*b-1))) / 4;
oy = ox + b;
}
void drawlevel(int level, double x, double y)
{
double ox, oy;
advance(x, y, ox, oy);
boxes(x, y, ox, oy, level);
if (abs(x-ox) > 0.0004)
{
drawlevel(level + 1, x, oy);
drawlevel(level + 1, ox, y);
}
}
int main()
{
drawlevel(0, 1, 1);
}