def recursion(S,prev,d):
# S stores the two ends of a geodesic segment
# prev tells which of a,a^-1,b,b^-1 we last applied
# d: depth countdown
draw S # draw appropriate arc of circle
if d < 1 : return
if prev != 2 : recursion(a.S, 1,d-1)
if prev != 1 : recursion(a^-1.S,2,d-1)
if prev != 4 : recursion(b.S, 3,d-1)
if prev != 3 : recursion(b^-1.S,4,d-1)
recursion(S0,0,depth)
def recursion_a(S):
draw S
if d>0: for i from 1 to 2:
recursion_b(a^i.S,d-1)
def recursion_b(S):
draw S
if d>0: for i from 1 to 6:
recursion_a(b^i.S,d-1)
for i from 0 to 2:
recursion_b(a^i.S0,depth)
The proportion of useful probes decreases exponentially with respect to the depth.
(means bad)
By chance the ratio of the size of two segments at the same depth remains in a bounded range.
Yet many unnecessary segments need to be considered to be sure to include the visible ones.
for each line i:
for each row j:
compute the color of the pixel i,j
def compute_color(z0):
z = z0
while z is not in fundamental triangle:
rotate z by b^i so that it falls in the blue cone
rotate z by c if not in fundamental triangle
# a max iteration counter can be added for security
return a color depending on the final z
| Cons | Pros |
|
|
A priori to draw a bitmap image of J we would like to be able to dectect whether J goes through a given pixel.
We will be a bit rough and instead try to estimate if the distance from the pixel center to J passes some threshold.
Worse: we will only estimate the distance up to some factor.
If you find any point a∈J then the set of its iterated preimages ⋃F-n{a} is dense in J.
So J intersects B(z,r) ⟺ there is some n such that a∈FnB(z,r).
This is good when r is small and z not too close to a critical point of F.
It works remarkably well for such a bold approximation.
A clear explanation of why is still missing. Related to bounded distorsion of inverse branches.
Good news: the image of a disk is a disk.
Next slide: for the {3,7} group, we start from B(z,ε), ε≈pixel-size. Iterate under a or b until z'=g.z falls in the fundamental domain, and we test whether g.B(z,ε) meets the boundary of a triangle.
The method for quasifuchsian groups in Indra's Pearls consists in drawing segments between a clever selection of words, properly ordered.
This yields fantastic images like the following by D. Wright:
How do you choose which element of the group to apply to a given pixel center or disk?
No advantage in exploring the whole group.
Need a guess of which group elements are more appropriate.
Not as easy as in the case of {3,7}.
The space G\H3 is a hyperbolic 3-manifold (or an orbifold if G has finite order elements).
For a quasifuchsian group, D has finitely many faces and reaches the sphere at infinity along a big domain.
For our proposed algorithm we need to find a finite subset K of G such that every face of D is contained in the median plane med(M,g.M) for some g∈K.
In my case I found such sets K by trial and error and with no certificate that they work… other than "the pictures look legitimate".
However, I think some talented programmer mathematicians have already created algorithms that automatically find such sets K.
For every P∈H3, if P∉D then there exists g∈K such that dist(g.P,M) < dist(P,M).
We can thus find how to send P back to D with G:
loop:
if for some g∈K, dist(g.P,M)<dist(P,M) :
P = g.P
continue loop
else: exit loop
Caution: a given disk has many representatives.
We can test whether the final disk, associated to (Pn,zn), meets ∂U. This will detect the boundary of the tiles of the tesselation of Ω by G.U.
![]() |
link |