The sides of the Harriss rectangle assuming the basic square has side 1:
{A, B} = N[{a, b} /. Solve[a/b == b/(a - 1) == 1/(b - 1), {a, b}][[1]]]
{2.32472, 1.75488}
A/B
1.32472
Recursive code. eps is a discretization to stop the iteration. The second argument tells whether we want to show the discretization process or not. p and q in the recursive function are the corners of the next rectangle to be subdivided:
HarrissSpiral[eps_, squares_] :=
Graphics[{EdgeForm[Black],
HarrissSpiralStep[{0, 0}, {A, B}, eps, squares]},
AspectRatio -> Automatic];
HarrissSpiralStep[p_, q_, eps_, squares_] :=
If[EuclideanDistance[p, q] > eps,
With[{
r = p + (A - 1)/
Sqrt[A^2 + B^2] RotationMatrix[-ArcTan[A, B]].(q - p),
s = p + B/Sqrt[A^2 + B^2] RotationMatrix[ArcTan[B, A]].(q - p),
t = p + Sqrt[1 + (A - 1)^2]/Sqrt[A^2 + B^2] (q - p)},
{If[squares,
{
Black, Arrow[{p, q}],
White, Rectangle[p, q],
Blue, Rectangle[r, s],
Orange, Rectangle[t, q]
},
{}
],
Red, AbsoluteThickness[5 Norm[s - p]],
Circle[p + RotationMatrix[-Pi/4].(s - p)/Sqrt[2],
Norm[s - p]/Sqrt[2], ArcTan @@ (s - p) + {Pi/4, 3 Pi/4}],
HarrissSpiralStep[r, s, eps, squares],
HarrissSpiralStep[t, q, eps, squares]
}],
{}
]
Only a few iterations:
HarrissSpiral[0.8, True]
More iterations:
HarrissSpiral[0.1, True]
Show only the quarter circles:
HarrissSpiral[0.02, False]
To understand the idea, the key is to follow the arrows, which determine the orientation of the rectangles. There is a blue or orange rectangle and a quarter circle per arrow. Some arrows are overlapped. All arrows are parallel or perpendicular.
Graphics[{EdgeForm[Black], Opacity[0.3], HarrissSpiralStep[{0, 0}, {A, B}, 0.7, True]},
AspectRatio -> Automatic]
Attachments: