Navigating a forest
A* algorithm
Graph
.
.
Generating surfing edges
Internal bitangents
Overlapping circles have no bitangents
External bitangents
Smaller circle entirely contained in larger one
Line of sight
Circle blocks line of sight
A and B visible from each other
0
1
u={{Math.round(100*(C.x-A.x)/(B.x-A.x))/100}}
d
r
Generating hugging edges
Enhancements
Circles don't overlap: both external and internal bitangents
Circles overlap: external bitangents only
Small circle contained by large one: no bitangents
Surfing edge line of sight
Hugging edge line of sight
Hugging edge blocked
Hugging edge valid
Larger circle contains smaller one
Circles don't overlap
Delayed edge generation
Cull cusped hugging edges