Note

This Mathematica notebook is from the WWW project A Visual Dictionary of Special Plane Curves. Copyright © 1995-2000 by Xah Lee. (http://xahlee.org/)

Packages and Initializations

SetOptions[{Plot3D, ParametricPlot3D, Graphics3D}, Axes -> True, 
      AxesLabel -> {"x", "y", "z"}, 
      LightSources :> 
        Table[{{Random[], Random[], Random[]}, 
            Hue[Random[], Random[Real, { .5, 1}], 
              Random[Real, { .5,  .9}]]}, {3}]];

Pseudosphere

The surface of revolution of Tractrix around its asymptotes is called Pseudosphere. Eugenio Beltrami in 1868 showed that the surface of the pseudosphere provided a partial model for hyperbolic geometry. It is a surface of constant negative curvature.

Let a denote the distance from the cusp to the curve's asymptote. The volumn enclosed by pseudosphere is 2/3 Pi a^3, half that of a sphere of radius a. The surface area of pseudosphere is 4 Pi a^2, same as the surface area of a sphere of radius a.

illustration

This is the parametric formula for Tractrix.

xf = Function[t, Log[Sec[t] + Tan[t]] - Sin[t]];
yf = (Cos@# &);

Given a parametric formuala {xf@t,yf@t}, the parametric formula for surface of revolution around x axes is:
{xf@x,yf@x*Cos@t,yf@x*Sin@t}

with t from 0 to 2 Pi.

ParametricPlot3D[{xf@x, yf@x*Cos@t, yf@x*Sin@t}, {x,  .1, 1.45}, {t, 
          2, 7}, PlotPoints -> {30, 30}];

illustration

problem: given a range 1 to 100, given a number divsion 100, and given a ratio 0.79, if we want to find the nearest division, we just do interger rounding, or we can use floor or ceiling functions. Now suppose all the range, number of division and ratio are arbitrary. Find the algorithm that gives the nearest division. (e.g. suppose given range 2*Pi, with 30 divisions, and the ratio is 0.7.

whole = 2*Pi;
divisions = 32;
ratio =  .3;
ratioPieces = 
        Floor[(whole*ratio)/(whole/
                divisions)];
ratioRounded = ratioPieces*(whole/divisions);

shift = 1;
gp1 = 
        First@ParametricPlot3D[{xf@x, yf@x*Cos@t, yf@x*Sin@t}, {x,  .1, 
              1.45}, {t, 0 + shift, ratioRounded + shift}, 
            PlotPoints -> {30, ratioPieces + 1}];

tMin = ratioRounded + shift;
tMax = whole + shift;
gp2 = 
        First@ParametricPlot3D[{xf@x, yf@x*Cos@t, yf@x*Sin@t}, {x,  .1, 
              1.45}, {t, tMin, tMax}, 
            PlotPoints -> {30, 
                divisions - ratioPieces + 1}];

Show@
        Graphics3D[{{EdgeForm[GrayLevel@0], 
              gp1 /. Polygon -> Line}, {EdgeForm[GrayLevel@0.8], gp2}}, 
          Axes -> False];