Sphere

Discrete

Single geodesic
GeodesicsBundle[IndexGraph@MeshConnectivityGraph[DiscretizeGraphics[Sphere[]]],{0.3,0.7},0]
In[]:=
Out[]=
Bundle of radius 1
GeodesicsBundle[IndexGraph@MeshConnectivityGraph[DiscretizeGraphics[Sphere[]]],{0.3,0.7},1]
In[]:=
Out[]=
Bundle of radius 3
GeodesicsBundle[IndexGraph@MeshConnectivityGraph[DiscretizeGraphics[Sphere[]]],{0.3,0.7},3]
In[]:=
Out[]=
IndexGraph@MeshConnectivityGraph[DiscretizeGraphics[Sphere[],MaxCellMeasure{"Area".005}]]
In[]:=
Out[]=
GeodesicsBundle[%200,{.3,.7},3]
In[]:=
Out[]=
3 parallel lines
GeodesicsAll[sphere,{{644,1274},{181,172},{313,165}}]
In[]:=
Out[]=
5 parallel lines
GeodesicsAll[sphere,{{644,1274},{181,172},{313,165},{2216,2234},{2027,2036}}]
In[]:=
Out[]=

Continuous

sphereGeodesic[p1_,p2_]:=Line[Normalize/@Table[p1+t(p2-p1),{t,0,1,0.01}]]
In[]:=
spherePoint[θ_,ϕ_]:={Cos[ϕ]Cos[θ],Sin[ϕ]Cos[θ],Sin[θ]}
In[]:=
Graphics3D[{Style[Sphere[],Yellow],Red,Thick,sphereGeodesic[spherePoint[0.48π,-π/4],spherePoint[-0.1π,-π/4]],sphereGeodesic[spherePoint[0.48π,-π/4+0.05/Cos[0.48π]],spherePoint[-0.1π,-π/4+0.05/Cos[-0.1π]]],sphereGeodesic[spherePoint[0.48π,-π/4-0.05/Cos[0.48π]],spherePoint[-0.1π,-π/4-0.05/Cos[-0.1π]]]},BoxedFalse]
In[]:=
Out[]=
SphereGeodesics[offsets_]:=Graphics3D[{Style[Sphere[],Yellow],Red,Thick,sphereGeodesic[spherePoint[0.4π,-π/4+#/Cos[0.4π]],spherePoint[-0.1π,-π/4+#/Cos[-0.1π]]]&/@offsets},BoxedFalse]
In[]:=
SphereGeodesics[Range[-.1,.1,.025]]
In[]:=
Out[]=

Plane

Single geodesic
GeodesicsBundle[Graph3D[GridGraph[{20,20}],GraphLayout"SpringElectricalEmbedding"],{94,210},0]
In[]:=
Out[]=
Bundle of radius 1
GeodesicsBundle[Graph3D[GridGraph[{20,20}],GraphLayout"SpringElectricalEmbedding"],{94,210},1]
In[]:=
Out[]=
Bundle of radius 3
GeodesicsBundle[Graph3D[GridGraph[{20,20}],GraphLayout"SpringElectricalEmbedding"],{94,210},3]
In[]:=
Out[]=

Continuous

PlaneGeodesics[offsets_]:=Graphics3D[{Style[Polygon[{{-0.7,-0.2,0},{-0.7,1.2,0},{0.7,1.2,0},{0.7,-0.2,0}}],Yellow],Thick,Red,Line[{{#,-.1,0},{#,1.1,0}}]&/@offsets},BoxedFalse]
In[]:=
PlaneGeodesics[Range[-.1,.1,.025]]
In[]:=
Out[]=

Hyperboloid

Single geodesic
GeodesicsBundle[Graph3D@IndexGraph@HyperbolicTilingGraph[],{0.05,0.95},0]
In[]:=
Out[]=
Bundle of radius 1
GeodesicsBundle[Graph3D@IndexGraph@HyperbolicTilingGraph[],{0.05,0.95},1]
In[]:=
Out[]=
Bundle of radius 3
GeodesicsBundle[Graph3D@IndexGraph@HyperbolicTilingGraph[],{0.05,0.95},3]
In[]:=
Out[]=

Continuous

https://demonstrations.wolfram.com/HyperboloidGeodesics/
hyperboloidGeodesics=TableNDSolve
Sinh[2u[t]](2
2
′
u
[t]
-
2
′
v
[t]
)
2Cosh[2u[t]]
+
′′
u
[t]0,2Tanh[u[t]]
′
u
[t]
′
v
[t]+
′′
v
[t]0,u[0]-.9,v[0]v0,u[1].9,v[1]v0,{u[t],v[t]},{t,0,1},MaxSteps∞1,{v0,Range[-.1,.1,.025]};
In[]:=
Show[ParametricPlot3D[{Sinh[u],Cosh[u]Sin[v],Cos[v]Cosh[u]},{u,-1,1},{v,-π/3,π/3},MeshFalse,BoxedFalse,AxesFalse,PlotStyleYellow],ParametricPlot3D[{Sinh[u[t]],Cosh[u[t]]Sin[v[t]],Cos[v[t]]Cosh[u[t]]}/.#,{t,0,1},PlotStyleRed]&/@hyperboloidGeodesics]
Out[]=