Skip to content

Commit e179893

Browse files
committed
struct and plotting recipie for embedded hubbard trees
1 parent 95cce03 commit e179893

File tree

3 files changed

+66
-134
lines changed

3 files changed

+66
-134
lines changed

parameters/DynamicPlane.jl

Lines changed: 0 additions & 72 deletions
This file was deleted.

trees/EmbedTrees.jl

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,20 @@ include("OrientTrees.jl")
22
include("../spiders/Spiders.jl")
33
include("../parameters/DynamicRays.jl")
44

5-
function embednodes(OHT::OrientedHubbardTree)
5+
struct EmbeddedHubbardTree
6+
zero::Sequence
7+
adj::Dict{Sequence,Vector{Sequence}}
8+
boundary::Vector{Sequence}
9+
onezero::Dict{Sequence{Char}, Char}
10+
angle::Rational
11+
rays::Dict{Rational,Vector{ComplexF64}}
12+
parameter::ComplexF64
13+
vertices::Dict{Sequence, ComplexF64} #maps each vertex in the tree to a point in the plane
14+
edges::Dict{Set{Sequence{Char}}, Tuple{Sequence{Char}, Vector{ComplexF64}}} #maps each edge to an oriented polyline
15+
end
16+
17+
function EmbeddedHubbardTree(OHT::OrientedHubbardTree)
18+
619
OZ = labelonezero(OHT)
720
anglelist = allanglesof(OZ,OHT)
821

@@ -50,24 +63,27 @@ function embednodes(OHT::OrientedHubbardTree)
5063
end
5164
end
5265

53-
return zvalues
66+
E = standardedges(OHT.adj,OHT.zero,zvalues)
67+
return EmbeddedHubbardTree(OHT.zero,OHT.adj,OHT.boundary,OZ,theta,rays,c,zvalues,E)
5468
end
5569

56-
function standardedges(OHT::OrientedHubbardTree,zvalues)
57-
edges = edgeset(OHT.adj)
70+
function standardedges(adj,zero,zvalues)
71+
edges = edgeset(adj)
5872

5973
edgevectors = []
6074
for edge in edges
61-
start = first(filter(z -> z!= OHT.zero,edge))
75+
start = first(filter(z -> z!= zero,edge))
6276
finish = first(filter(z -> z!= start,edge))
6377
push!(edgevectors,Pair(edge,(start,[zvalues[start],zvalues[finish]])))
6478
end
6579
return Dict(edgevectors)
6680
end
6781

68-
function longpath(OHT, edgevectors, start, finish)
69-
nodes = nodepath(OHT.adj, start, finish)
70-
edges = edgepath(OHT.adj, start, finish)
82+
function longpath(EHT, start, finish)
83+
nodes = nodepath(EHT.adj, start, finish)
84+
edges = edgepath(EHT.adj, start, finish)
85+
86+
edgevectors = EHT.edges
7187

7288
segments = [edgevectors[edge][2] for edge in edges]
7389

@@ -107,29 +123,31 @@ function refinedtree(OHT,zvalues,steps)
107123
return E
108124
end
109125

110-
function refinetree(OHT,c,edgevectors)
126+
function refinetree!(EHT::EmbeddedHubbardTree)
127+
111128
newedges = []
112-
for edge in keys(edgevectors)
113-
start = edgevectors[edge][1]
129+
for edge in keys(EHT.edges)
130+
start = EHT.edges[edge][1]
114131
finish = first(filter(x->x!=start,edge))
115132
#determine the image of this edge
116-
image = longpath(OHT,edgevectors,shift(start),shift(finish))
133+
image = longpath(EHT,shift(start),shift(finish))
117134

118135
refinedimage = [image[1]]
119136
for point in image[2:end]
120137
push!(refinedimage, (refinedimage[end]+point)/2)
121138
push!(refinedimage,point)
122139
end
123140

141+
c = EHT.parameter
124142
x = sqrt(-c + refinedimage[1])
125143

126-
if abs2(x-edgevectors[edge][2][1]) < abs2(-x-edgevectors[edge][2][1])
127-
push!(newedges,Pair(edge,(start,path_sqrt(-c .+ refinedimage))))
144+
if abs2(x-EHT.edges[edge][2][1]) < abs2(-x-EHT.edges[edge][2][1])
145+
EHT.edges[edge] = (start,path_sqrt(-c .+ refinedimage))
128146
else
129-
push!(newedges,Pair(edge,(start,-path_sqrt(-c .+ refinedimage))))
147+
EHT.edges[edge] = (start,-path_sqrt(-c .+ refinedimage))
130148
end
131149
end
132-
return Dict(newedges)
150+
return EHT
133151
end
134152

135153
function plotedges!(scene,edgevectors)

trees/ShowTree.jl

Lines changed: 32 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,37 @@
11
using GLMakie
2-
include("HubbardTrees.jl")
3-
include("OrientTrees.jl")
42
include("EmbedTrees.jl")
53
include("../spiders/Spiders.jl")
64
include("../parameters/DynamicRays.jl")
5+
include("../parameters/RenderFractal.jl")
76

8-
### Convenience functions
9-
function plottree!(scene,angle::Rational)
10-
return plottree!(scene,OrientedHubbardTree(angle))
7+
@recipe(TreePlot,EHT) do scene #TODO add kwargs to toggle plotting the julia set and the external rays
8+
Theme()
119
end
1210

13-
function plottree!(scene,K::Sequence)
14-
return plottree!(scene,HubbardTree(K))
15-
end
16-
17-
function plottree(H)
18-
fig = Figure()
19-
ax = Axis(fig[1,1])
20-
return (fig,plottree!(ax,H))
21-
end
22-
###
23-
24-
25-
function plottree!(scene, OHT::OrientedHubbardTree,steps = 8,colors = [])
26-
OZ = labelonezero(OHT)
11+
function Makie.plot!(myplot::TreePlot)
12+
(EdgeList,Nodes) = adjlist(EHT.adj)
13+
criticalorbit = orbit(EHT.zero)
2714

28-
anglelist = allanglesof(OZ,OHT)
29-
30-
(EdgeList,Nodes) = adjlist(OHT.adj)
31-
32-
criticalorbit = orbit(OHT.zero)
33-
3415
labels = []
3516
nodecolors = []
3617
for node in Nodes
3718
firstchar = node.items[1]
3819
if firstchar == '*'
3920
push!(nodecolors,"black")
4021
elseif firstchar == 'A' #we are fully in one of the 4 regions
41-
if OZ[node] == '0'
22+
if EHT.onezero[node] == '0'
4223
push!(nodecolors,"blue")
43-
elseif OZ[node] == '*'
24+
elseif EHT.onezero[node] == '*'
4425
push!(nodecolors,"turquoise")
45-
elseif OZ[node] == '1'
26+
elseif EHT.onezero[node] == '1'
4627
push!(nodecolors,"green")
4728
end
4829
elseif firstchar == 'B'
49-
if OZ[node] == '0'
30+
if EHT.onezero[node] == '0'
5031
push!(nodecolors,"red")
51-
elseif OZ[node] == '*'
32+
elseif EHT.onezero[node] == '*'
5233
push!(nodecolors,"orangered2")
53-
elseif OZ[node] == '1'
34+
elseif EHT.onezero[node] == '1'
5435
push!(nodecolors,"orange")
5536
end
5637
end
@@ -65,22 +46,16 @@ function plottree!(scene, OHT::OrientedHubbardTree,steps = 8,colors = [])
6546
end
6647
end
6748

68-
zvaluedict = embednodes(OHT)
69-
zvalues = []
70-
for node in Nodes
71-
push!(zvalues,zvaluedict[node])
72-
end
49+
zvalues = [EHT.vertices[node] for node in Nodes]
7350

74-
E = refinedtree(OHT,zvaluedict,steps)
75-
76-
pos = Point.(real.(zvalues)/2,imag.(zvalues)/2) #divide by 2 here for the scene coordinate system
51+
pos = Point.(real.(zvalues),imag.(zvalues))
7752

7853
colorsforinterior = ["red","blue","green","orange"]
7954

8055
for (ii,p) in enumerate(EdgeList)
8156
for n in p
82-
cmplxedge = E[Set([Nodes[ii],Nodes[n]])][2]
83-
realedge = Point.(real.(cmplxedge)/2,imag.(cmplxedge)/2)
57+
cmplxedge = EHT.edges[Set([Nodes[ii],Nodes[n]])][2]
58+
realedge = Point.(real.(cmplxedge),imag.(cmplxedge))
8459
if nodecolors[ii] in colorsforinterior
8560
col = nodecolors[ii]
8661
elseif nodecolors[n] in colorsforinterior
@@ -90,17 +65,28 @@ function plottree!(scene, OHT::OrientedHubbardTree,steps = 8,colors = [])
9065
elseif nodecolors[n] !== "black"
9166
col = nodecolors[n]
9267
end
93-
lines!(scene,realedge,color = col,linewidth = 1,transparency = true,overdraw = true)
68+
lines!(myplot,realedge,color = col,linewidth = 1,transparency = true,overdraw = true)
9469
end
9570
end
9671

97-
scatter!(scene,pos,color = nodecolors)
72+
julia = inverseiterate(EHT.parameter,20)
73+
scatter!(myplot,real(julia),imag(julia),markersize = 1,color = "black")
74+
75+
76+
rays = collect(values(EHT.rays))
77+
n = length(rays)
78+
for (j ,ray) in enumerate(rays)
79+
lines!(myplot,real(ray),imag(ray),color = get(ColorSchemes.rainbow, float(j)/float(n)))
80+
end
81+
82+
scatter!(myplot,pos,color = nodecolors)
9883
tex = [node[2] for node in labels]
99-
text!(scene,pos,text = tex)
100-
101-
return scene
84+
text!(myplot,pos,text = tex)
85+
limits!(-2,2,-2,2)
86+
return myplot
10287
end
10388

89+
10490
function plottree!(scene, H::HubbardTree)
10591

10692
(E, nodes) = adjlist(H.adj)

0 commit comments

Comments
 (0)