Plane Involutes and Evolutes:
with applications to sea navigation in the Age of Exploration
by John Oprea
This worksheet deals with special types of curves called involutes and evolutes. A general reference is J. Oprea, Differential Geometry and its Applications . These are curves which can be associated to any given curve . An involute to may be thought of as any curve which is always perpendicular to the tangent lines of . If you think of unwinding string tautly from around a curve, you will get a picture of an involute. An evolute of is a curve whose involute is , so evolutes and involutes are, in a sense, inverses to each other. An evolute of may also be thought of as the curve determined by the centers of curvature of . Involutes are used in gear tooth design to eliminate vibration as much as possible, while the involute and evolute of a very special curve (see below) can be used to design a special type of clock. We start with the usual
> with(plots):with(linalg):
> dp2:= proc(X,Y)
> X[1]*Y[1]+X[2]*Y[2];
> end:
> nrm := proc(X)
> sqrt(dp2(X,X));
We also need a procedure to calculate arclength (in terms of the curve parameter t).
> arclength:=proc(alpha)
> local alphap;
> alphap:=diff(subs(t=u,alpha),u);
> int(nrm(alphap),u=0..t);
Since we are only interested in plane curves here, we give a procedure for curvature which does not use cross product.
> curvature:=proc(alpha)
> local alphap,alphapp;
> alphap:=diff(alpha,t);
> alphapp:=diff(alphap,t);
> simplify(abs(alphap[1]*alphapp[2]- alphap[2]*alphapp[1])/nrm(alphap)^3,symbolic);
The next two procedures calculate the unit tangent and normal vectors for the curve, T and N, respectively.
> unit_tanvec:=proc(alpha)
> local a,b,c;
> a:=simplify(diff(alpha[1],t)/nrm(diff(alpha,t)),symbolic);
> b:=simplify(diff(alpha[2],t)/nrm(diff(alpha,t)),symbolic);
> [a,b];
> unit_norm:=proc(alpha)
> local alphap,alphapp,speed,a,b; alphap:=diff(alpha,t);
> speed:=nrm(alphap);
> a:=scalarmul(unit_tanvec(alpha),diff(speed,t));
> b:=curvature(alpha)*speed^2;
> map(simplify,evalm(scalarmul(alphapp,1/b)-scalarmul(a,1/b)), symbolic);
The involute is now given by the formula where s(t) is the arclength along the curve from some fixed point. This means that, from a point on the curve, the corresponding point on the involute is in the direction of the negative tangent and is s(t) far away.
> involute:=proc(alpha)
> local aa,bb;
> aa:=simplify(alpha[1]-arclength(alpha)* diff(alpha[1],t)/nrm(diff(alpha,t)),symbolic);
> bb:=simplify(alpha[2]-arclength(alpha)* diff(alpha[2],t)/nrm(diff(alpha,t)),symbolic);
> [aa,bb];
The plane evolute to has formula where N(t) is the unit normal to the curve and is the curvature function.
> evolute:=proc(alpha)
> local aa,bb,alphap,alphapp,A,C;
> aa:=simplify(curvature(alpha),symbolic); bb:=map(simplify,unit_norm(alpha),symbolic); map(simplify,evalm(alpha+scalarmul(bb,1/aa)),symbolic);
Let's look at some examples. The circle is the obvious first choice.
> circle:=[cos(t),sin(t)];
> circinv:=involute(circle);
> circinvplot:=plot([circinv[1],circinv[2],t=0..2*Pi]):
> circplot:=plot([cos(t),sin(t),t=0..2*Pi],color=blue):
> display({circinvplot,circplot},scaling=constrained);
In order to see the evolute of the circle, ask yourself what the centers of curvature are for all points on the circle. Here is the unit normal to help.
> unit_norm(circle);
So the evolute must be the center of the circle!
> evolute(circle);
Now let's try a harder curve, an astroid.
> astroid:=[cos(t)^3, sin(t)^3];
> astevol:=evolute(astroid);
This complicated mess can be simplified (although Maple will not do it easily) to show that the evolute is another astroid! To see this, plot the evolute.
> plot([astevol[1],astevol[2],t=0..2*Pi],scaling=constrained);
Here is a catenary (i.e. the shape of a hanging wire).
> catenary:=[t,cosh(t)];
> involute(catenary);
> evolute(catenary);
Now try a sideways parabola and notice the cusp curve called Neil's parabola arising as the evolute.
> parabola:=[t^2/2,t];
> involute(parabola);
> evolute(parabola);
> parplot:=plot([t^2/2,t,t=-2..2]):
> parinvplot:=plot([-1/2*t*arcsinh(t)/(sqrt(t^2+1)),-1/2* (-t*sqrt(t^2+1)+arcsinh(t))/(sqrt(t^2+1)),t=-2..2],color=cyan):
> parevolplot:=plot([3/2*t^2+1,-t^3,t=-2..2],color=blue):
> display({parplot,parinvplot,parevolplot},scaling=constrained);
Finally, we come to the curve which seems to have prompted the invention of involutes and evolutes. In the 1600's, explorations of the world began in earnest by the seafaring nations of Europe. Of course, the problem of navigation arose and, while it was easy to fix latitude (e.g. using Polaris) at sea, it was next to impossible to fix longitude. This caused many famous disasters. The simplest plan to find longitude was this: first, on each day of the year, note what time the sun was at its highest point (always called noon) in Greenwich, England and compile this information (to be taken along on ships); next carry a clock along on board ship set to Greenwich time; at sea, note the time that the sun was at its zenith (i.e. local noon) using this clock and compare to the compiled information. For example, if, on a certain day, the sun was at its highest point at 12:00 pm in Greenwich, but at its highest point at sea at 11:00 am on the Greenwich clock, then the ship would be at 15 degrees west longitude from the prime meridian through Greenwich. (Why does one hour of time equal 15 degrees here?) The problem with the plan was that, at the time, clocks worked by pendula and, while we often say that, for small oscillations, a pendulum's period does not depend on the amplitude, this is no longer true for larger oscillations --- the very type of swings which might be expected at sea! So, how could the period of a pendulum truly be independent of the amplitude?
Christian Huygens found an answer in the 1670's (or so). Huygens knew that a cycloid was a tautochrone (see Differential Geometry and its Applications) ; a curve with the property that a particle sliding down it (without friction) takes the same time to reach the bottom, no matter where it starts on the curve. So, if a pendulum bob could be induced to freely follow the path of a cycloid, its period would be independent of its amplitude. But how could the bob be induced to follow a cycloidal path?
Before we say, let's look at the involute and evolute of a particular cycloid.
> cycloid:=[t+sin(t),3-cos(t)];
> plot([t+sin(t), 3-cos(t),t=0..2*Pi]);
> cycplot:=plot([t+sin(t), 3-cos(t),t=0..2*Pi]):
Now imagine unwinding a thread from the cycloid above with fixed end at the cusp on top. The path followed by the end of the thread is, of course, the involute of the cycloid.
> cycinv:=involute(cycloid);
The reader may check by hand (since Maple simplification does not work well here) that the expressions above give another cycloid!
> invcyc:=[t-sin(t),1+cos(t)];
Let's plot the involute together with the original cycloid.
> invcycplot:=plot([t-sin(t),1+cos(t),t=0..2*Pi],color=blue):
> display({cycplot,invcycplot},scaling=constrained);
What we are seeing is that the pendulum bob will follow a cycloidal path if the pendulum itself is flexible and it peels off barriers in the shape of cycloids. To design the barriers, first choose a path (i.e. a particular cycloid) and, since it is to be the involute of the barrier cycloid, take its evolute. For instance, if we take the evolute of the path above, we get
> evolute(invcyc);
the original barrier cycloid. Unfortunately, Huygens plan didn't solve the problem of longitude. For the full story, see D. Sobel, Longitude .