Objects between dimension 1 and 2
Replace an object by N copies of itself, each scaled by a ratio r. The similarity dimension is d = log N / log(1/r). A segment cut into N pieces of ratio 1/N gives 1; a square cut into N2 pieces of ratio 1/N gives 2. Anything with a ratio in between gives a non-integer d. The table below uses exact N and r; I recomputed each value with fractals-verify.py. Similarity dimension equals the true dimension only when the pieces do not overlap much, which holds for these classical examples.
| Object | N | 1/r | d |
|---|---|---|---|
| Koch curve | 4 | 3 | 1.2619 |
| Cantor dust (4 squares of side 1/3) | 4 | 3 | 1.2619 |
| Tent curve (this chapter) | 4 | 23/2 | 1.3333 |
| Minkowski sausage curve | 8 | 4 | 1.5000 |
| Sierpinski triangle | 3 | 2 | 1.5850 |
| Sierpinski carpet | 8 | 3 | 1.8928 |
Two things to keep straight. Dimension in this sense is a measure of how an object fills space, not whether it is a curve: the Cantor dust is totally disconnected yet sits at 1.26, and the carpet has zero area yet sits near 1.89. Also, a single construction can sweep through the whole range. Keep four pieces and let the ratio change: the tent family below has d = 1.0000 at θ = 0°, 1.0256 at 15°, 1.1158 at 30°, 1.3333 at 45°, and 1.6694 at 55° (similarity dimension; an upper bound once pieces start to overlap). The rest of the chapter takes the 45° member, because it is the one that gives exactly 4/3.
Which one is 1.333?
Not the Koch curve. Koch replaces each segment by four pieces each one third as long, so d = log 4 / log 3 = 1.2619. To get 4/3 with four pieces you need pieces of length r with log 4 / log(1/r) = 4/3, which gives 1/r = 43/4 = 23/2 ≈ 2.828. The curve below uses exactly that ratio: four pieces, each 2−3/2 times the parent.
As far as I know, 4/3 also appears elsewhere in the literature: the frontier of planar Brownian motion, the exponent of the two-dimensional self-avoiding walk (ν = 3/4), and the SLE8/3 curve (1 + κ/8). None of these is checked in this chapter. They share a number with our curve, not a construction and not an invariant.
The tent curve
Take the unit segment from 0 to 1 in the plane. The generator replaces it by four straight pieces through the points (0,0), (¼,¼), (½,½), (¾,¼), (1,0): two pieces rising at 45°, two falling at 45°. Each piece has length ¼·√2 = 2−3/2. To refine a level, replace every piece by a copy of the generator carried onto it by the rotation-and-scaling that sends the unit segment to that piece (an orientation-preserving similarity). The curve is the limit of the levels.
Hand derivation
The similarity dimension d solves N rd = 1 with N = 4 and r = 2−3/2. Then 4 · 2−3d/2 = 1, so 22 − 3d/2 = 1 and d = 4/3. At level n the polygon has length (N r)n = (√2)n, which grows without bound.
d = log N / log(1/r) = (2 log 2)/((3/2) log 2) = 4/3
length at level n: L_n = (√2)^n → ∞ (a rectifiable limit would have finite length)
Two caveats the formula does not remove. First, similarity dimension equals the true (Hausdorff) dimension only when the pieces overlap little (an open-set condition); I have not proved that condition for this curve, only checked it numerically to level 5 (§5). Second, I looked only at the 45° member. In a family with apex angle θ the ratio is r = 1/(4 cos θ) and the similarity dimension is log 4 / log(4 cos θ); other angles give other dimensions, but the formula is only an upper bound once pieces overlap. 45° is the case where the answer is exactly 4/3.
Exact integer scan at angles with rational tangent (fractals-angle-scan.py, tan θ = 1/4, 1/3, 1/2, 2/3, 3/4, 1, 4/3, 3/2, 2): 45° is the only one with no proper self-crossing through level 6. For the others a first crossing appears at a level that falls as the angle grows: none through level 6 at 14.04°, level 6 at 18.43°, level 5 at 26.57°, level 4 at 33.69° and 36.87°, and level 3 or 4 above 45° (53.13° and 56.31° at level 4, 63.43° at level 3). Observation only, at the levels tested. I do not know whether a crossing in the polygons means the similarity-dimension formula fails for the limit; that is open, and the angles are only those listed. The earlier floating-point scan is superseded by this one.
A hypothesis I tested and dropped: that 45° is special because its vertices sit on a square lattice. Every rational tangent gives lattice vertices (the piece multipliers are Gaussian rationals), and those angles still cross, so lattice alignment does not separate 45°. What does differ (fractals-directions.py, exact integers): the number of distinct segment directions at levels 1 to 5 is 2, 3, 4, 4, 4 at 45° (it stops growing) and 2, 3, 4, 5, 6 at each other angle tried (it grows by one per level). So 45° is the angle where the rotations by ±45° close up into a finite set of directions. This is a structural fact at the levels tested; I did then find an argument that does explain it, below.
Proposition (45° tent, finite levels). At every level n the polygon has no proper self-crossing: two non-adjacent segments meet only at shared points or along a shared collinear stretch.
Argument (hand-derived; the two structural facts are checked numerically through level 8 by fractals-grid-lemma.py, but nothing is formalized in Lean). Each refinement turns the direction u of a piece into u·e±iπ/4, so the directions alternate between the four axis directions at even levels and the four diagonals at odd levels. (A) At even level 2m the polygon is a path along edges of the square grid of spacing 8−m. This holds at level 0 and, by induction, at level 2m+2: the two-step generator is 16 axis-parallel pieces of length 1/8 with vertices on the 1/8-grid, and carrying it onto a grid edge by a rotation through a multiple of 90° and a scaling keeps all vertices on the finer grid. Two grid edges meet only at a common endpoint or coincide, so no proper crossing. (B) Level 2m+1 replaces each directed grid edge by a tent: two legs running from the edge's ends to the centre of the cell on its left. Cut every cell by both diagonals into four triangles; a tent lies on the boundary of the triangle on its edge. Different directed edges give different triangles (an edge and its reverse have the cell on opposite sides; the four edges of one cell have four different triangles), so the triangles have disjoint interiors, and two tents from different directed edges can meet only at a grid vertex or a cell centre, which is a touch, not a crossing. The same directed edge visited twice gives identical tents, the collinear overlaps seen in the counts.
Lean: FractalGridLemma.lean states the even-level half (steps are unit lattice steps, the steps sum to (8m, 0), and unit lattice edges never properly cross, so no two edges of the level-2m polygon do). It compiles with no errors and no sorry on Lean v4.32.0 (core only; axioms: propext, Classical.choice, Quot.sound), checked by the author. It does not contain the odd-level tent argument, and it does not prove that its two-step generator equals two applications of the tent refinement; that identification is the hand computation above plus a numerical check.
This is a statement about the polygons at each finite level. It does not show that the limit curve is simple, and it does not by itself prove the open-set condition for the dimension 4/3. At the other angles tested the polygons do cross, and the argument has no analogue there because the directions never close up.
Levels 0 to 5
Open the interactive plate → (zoom, trace, change level and angle, zoom to a touch point, switch between tent, Koch, Minkowski and Sierpinski).
Verifier output
I ran fractals-verify.py on the repository machine. It builds the levels with exact complex-number similarities and reports the following.
level length, measured vs √2^n: n=0..6 agree to 6 decimals (1, 1.414214, 2, 2.828427, 4, 5.656854, 8)
proper self-crossings, levels 1–5 (exact rational arithmetic): 0, 0, 0, 0, 0
touching non-adjacent pairs, levels 1–5: 0, 0, 12, 70, 316
box-count slope, Koch (true 1.2619): 1.318 tent (true 1.3333): 1.260
So the algebra and the length are exact, and no pieces properly cross through level 5. But the exact check also shows the curve touches itself from level 3 on (12, 70, 316 touching pairs at levels 3, 4, 5), so the limit is not a simple arc. Touching is compatible with the open-set condition, which only forbids substantial overlap, but I have not proved it; this is a finite check, not a proof. I caught this because a floating-point version of the same test gave nonzero crossing counts at level 5: the touch points are exactly where rounding error flips the answer, so floating-point crossing counts are unreliable for this curve and should not be quoted. The box-count slopes are off by about 0.06 in opposite directions for the two curves, so box counting at these scales cannot distinguish 1.26 from 1.33. I report it as a sanity check on the code, and I do not offer it as a measurement of the limit. The verifier is untested by anyone but me until you run it yourself: python3 fractals-verify.py.
Touching pairs between non-adjacent pieces, counted in exact integer arithmetic (fractals-touch-count.py for levels 3 to 8, and the faster vertex-hashing counter fractals-touch-fast.py, which reproduces those six values exactly and reaches level 12): levels 3 to 12 give 12, 70, 316, 1310, 5348, 21550, 86476, 346270, 1385812, 5544270, with 0 proper crossings at every level the slow counter reached. The fast counter only sees contacts at shared vertices, so its agreement with the slow one is checked for levels 3 to 8 and assumed beyond. The level-to-level ratios tend to 4 (4.013, 4.004, 4.002, 4.0007 at levels 9 to 12). Touching pairs per piece (divide by 4n) are 0.3299, 0.3302, 0.3304, 0.3305 at levels 9 to 12, rising more and more slowly; a three-point extrapolation of the last three values gives about 0.3305. That is below 1/3, so an earlier suggestion that the per-piece value tends to 1/3 is not supported by these numbers (the extrapolation assumes the differences shrink geometrically, which is itself unproved). I tried integer linear recurrences up to order 4 and sums of terms 4n, n4n, 2n, n2n, 2n/2, n2n/2, polynomials in n, with and without separating even and odd levels, against these ten values; none fits exactly. The data show the touches track 4n (a bounded number of contacts per piece, on average), not a formula. Observation only: nothing here is proved, and a bounded number of contacts per piece would be consistent with the open-set condition without proving it.
The formula in Theorem 3.4
The Cluster-plasma entry in the GOMC Opus notes states df = 1 + log μ / log λ, with μ a fold-depth and λ a compression ratio. For our curve write μ = N r = √2 (the length gained per level) and λ = 1/r = 23/2. Then 1 + log μ / log λ = 1 + (1/2)/(3/2) = 4/3, the same value as above. This shows the formula is a rewriting of the similarity-dimension identity d = 1 + log(N r)/log(1/r). It does not verify anything about Cluster data, where the quoted range is df ≈ 1.6–1.8; that would need μ and λ measured from the data, which this chapter does not do.
Shared functional form, not a shared invariant. Many unrelated systems give the same number or the same formula; that is not evidence of a common mechanism.
Try it
1. Change r to 1/3 in the verifier's generator and confirm 1.2619. 2. For N = 4, find r giving d = 1.5, and say whether the construction can still avoid overlap. 3. Using the θ family, find the θ that gives d = 1.25 and test it for crossings.