Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- paths = {{{348.488, 132.622}, {336.333, 63.6857}, {394.365, 24.5422},
- {39.3603, 78.1653}, {109.094, 84.2662}, {170.317, 50.3295},
- {195.403, 115.68}, {263.324, 132.615}, {316.947, 177.61},
- {381.382, 150.259}, {49.8526, 164.812}, {41.3217, 95.3342},
- {11.7384, 158.776}, {65.3616, 113.781}, {5.35985, 77.728},
- {18.7165, 9.01408}, {358.715, 372.961}, {394.767, 312.96},
- {340.367, 268.907}, {313.016, 333.343}, {269.92, 388.503}}};
- r = 3;
- torus[{u_, v_}] := {Cos[u]*(Sin[v] + r), Sin[u]*(Sin[v] + r), Cos[v]}
- Needs["VariationalMethods`"]
- eq = EulerEquations[Sqrt[Total[D[torus[{u, v[u]}], u]^2]], v[u], u];
- geodesic[{{u1_, v1_}, {u2_, v2_}}] := Module[{start, g, sol},
- If[u2 < u1, Return[geodesic[{{u2, v2}, {u1, v1}}]]];
- sol = ParametricNDSolve[Flatten[{
- eq, v[0] == v1, v'[0] == a
- }], v, {u, 0, u2 - u1}, {a}];
- start = a /. FindRoot[Evaluate[(v[a][u2 - u1] - v2 /. sol)], {a, 0}];
- g = v[start] /. sol;
- Function[t, {u1 + t*(u2 - u1), g[t*(u2 - u1)]}]
- ]
- LocatorPane[
- Dynamic[pts],
- Dynamic[ParametricPlot[Evaluate[geodesic[pts][t]], {t, 0, 1},
- PlotRange -> {{-π, π}, {-π, π}}, Axes -> True,
- AspectRatio -> 1/r]]]
- Show[
- ParametricPlot3D[
- torus[{u, v}], {u, -π, π}, {v, -π, π},
- PlotStyle -> White, ImageSize -> 500],
- ParametricPlot3D[Evaluate[torus[geodesic[pts][t]]], {t, 0, 1},
- PlotStyle -> Red]
- ]
- Clear[geodesicFindMin]
- geodesicFindMin[{p1_, p2_}, nPts_: 25] :=
- Module[{approximatePts, optimizeOffset, optimizeOffsets, direction,
- normal, pathLength, optimalPath, interpolations, len, solution},
- direction = p2 - p1;
- normal = {{0, 1}, {-1, 0}}.direction;
- approximatePts = Join[
- {p1},
- Table[
- p1 + i*direction/(nPts + 1) + optimizeOffset[i]*normal, {i,
- nPts}],
- {p2}];
- pathLength = Total[Norm /@ Differences[torus /@ approximatePts]];
- {len, solution} =
- Quiet[FindMinimum[pathLength,
- Table[{optimizeOffset[i], 0}, {i, nPts}]]];
- optimalPath = approximatePts /. solution;
- interpolations =
- ListInterpolation[#, {{0, 1}}] & /@ Transpose[optimalPath];
- Function[t, #[t] & /@ interpolations]
- ]
- LocatorPane[
- Dynamic[pts],
- Dynamic[ParametricPlot[Evaluate[geodesicFindMin[pts][t]], {t, 0, 1},
- PlotRange -> {{-π, π}, {-2 π, 2 π}}, Axes -> True,
- AspectRatio -> 2/r]]]
- Show[
- ParametricPlot3D[
- torus[{u, v}], {u, -π, π}, {v, -π, π},
- PlotStyle -> Directive[White], ImageSize -> 500],
- ParametricPlot3D[Evaluate[torus[geodesicFindMin[pts][t]]], {t, 0, 1},
- PlotStyle -> Red]
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement