| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- \documentclass[margin=1cm]{standalone}
- \usepackage{asymptote}
- \begin{document}
- \begin{asy}
- settings.render = 0;
- settings.prc = false;
- import graph3;
- import contour;
- size3(8cm);
- currentprojection = orthographic(10,1,4);
- defaultrender = render(merge = true);
- // create torus as surface of rotation
- int umax = 40;
- int vmax = 40;
- surface torus = surface(Circle(c=2Y, r=0.6, normal=X, n=vmax), c=O, axis=Z, n=umax);
- torus.ucyclic(true);
- torus.vcyclic(true);
- pen meshpen = 0.3pt + gray;
- draw(torus, surfacepen=material(diffusepen=white+opacity(0.6), emissivepen=white));
- for (int u = 0; u < umax; ++u)
- draw(torus.uequals(u), p=meshpen);
- for (int v = 0; v < vmax; ++v)
- draw(graph(new triple(real u) {return torus.point(u,v); }, 0, umax, operator ..),
- p=meshpen);
- pair a = (floor(umax/2) + 2, 3);
- dot(torus.point(a.x, a.y), L="$a$", align=W);
- pair b = (5, floor(vmax/2));
- dot(torus.point(b.x, b.y), L="$b$", align=2Z + X);
- path3 abpath(int ucycles, int vcycles) {
- pair bshift = (ucycles*umax, vcycles*vmax);
- triple f(real t) {
- pair uv = (1-t)*a + t*(b+bshift);
- return torus.point(uv.x, uv.y);
- }
- return graph(f, 0, 1, operator ..);
- }
- real linewidth = 0.8pt;
- draw(abpath(0,0), p=linewidth + orange);
- draw(abpath(1,0), p=linewidth + red);
- draw(abpath(1,-1), p=linewidth + darkgreen);
- \end{asy}
- \end{document}
|