Click here to Skip to main content
Click here to Skip to main content

Hypocycloid

, 22 Dec 2009
Rate this:
Please Sign up or sign in to vote.
A Windows Forms control to model the behaviour of a hypocycloid curve.

Introduction

Math problems have a charm of their own. Besides, they help to develop a programmer's skill. Here, we describe a student's exam task: "Develop an application that models the behaviour of a Hypocycloid".

App.jpg

Background

A cycloid is the curve defined by the path of a point on the edge of a circular wheel as the wheel rolls along a straight line. It was named by Galileo in 1599 (http://en.wikipedia.org/wiki/Cycloid).

A hypocycloid is a curve generated by the trace of a fixed point on a small circle that rolls within a larger circle. It is comparable to the cycloid, but instead of the circle rolling along a line, it rolls within a circle.

Use Google to find a wonderful book of Eli Maor, Trigonometric Delights (Princeton, New Jersey). The following passage is taken from this book.

I believe that a program developer must love formulas derivation. Hence, let us find the parametric equations of the hypocycloid.

Hypocycloid.png

A point on a circle of radius r rolls on the inside of a fixed circle of radius R. Let C be the center of the rolling circle, and P a point on the moving circle. When the rolling circle turns through an angle in a clockwise direction, C traces an arc of angular width t in a counterclockwise direction. Assuming that the motion starts when P is in contact with the fixed circle (figure on the left), we choose a coordinate system in which the origin is at O and the x-axis points to P. The coordinates of P relative to C are:

(r cos b; -r sin b)

The minus sign in the second coordinate is there because b is measured clockwise. Coordinates of C relative to O are:

((R - r) cos t, (R - r) sin t)

Note, angle b may be expressed as:

b = t + β; β = b - t

Thus, the coordinates of P relative to O are:

((R - r) cos t + r cos β, (R - r) sin t - r sin β) (1)

But the angles t and b are not independent: as the motion progresses, the arcs of the fixed and moving circles that come in contact must be of equal length L.

L = R t L = r b

Using this relation to express b in terms of t, we get

b = R t / r

Equations (1) become:

x = (R - r) cos t + r cos ((R / r - 1) t) (2)
y = (R - r) sin t - r sin ((R / r - 1) t)

Equations (2) are the parametric equations of the hypocycloid, the angle t being the parameter (if the rolling circle rotates with constant angular velocity, t will be proportional to the elapsed time since the motion began). The general shape of the curve depends on the ratio R/r. If this ratio is a fraction m/n in lowest terms, the curve will have m cusps (corners), and it will be completely traced after moving the wheel n times around the inner rim. If R/r is irrational, the curve will never close, although going around the rim many times will nearly close it.

Using the code

The demo application provided with this article uses a Hypocycloid control derived from UserControl to model a behaviour of a hypocycloid described above.

The functionality of the hypocycloid is implemented in the Hypocycloid class. It has a GraphicsPath path data field that helps to render the hypocycloid path over time. A floating point variable, angle, corresponds to the angle t described earlier.

  • Variable ratio = R / r
  • delta = R - r

All the math is done within the timer Tick event handler.

void timer_Tick(object sender, EventArgs e)
{
   angle += step;
   double
    cosa = Math.Cos(angle),
    sina = Math.Sin(angle),
    ct = ratio * angle;

   movingCenter.X = (float)(centerX + delta * cosa);
   movingCenter.Y = (float)(centerY + delta * sina);
   PointF old = point;
   point = new PointF(
     movingCenter.X + r * (float)Math.Cos(ct),
     movingCenter.Y - r * (float)Math.Sin(ct));
   int n = (int)(angle / pi2);
   if (n > round)
   {
     round = n;
     ParentNotify(msg + ";" + round);
   }
   if (round < nRounds)
    path.AddLine(old, point);
   else if (!stopPath)
   {
     ParentNotify(msg + ";" + round + ";" + path.PointCount);
     stopPath = true;
   }
   parent.Invalidate();
}

ParentNotify is the event of the generic delegate type Action<string>.

public event Action<string> ParentNotify;

We use it to notify a parent control of a current angle (round).

Besides a constructor, the class has the following public methods: Reset, Draw, Start, Stop, and SaveToFile. Remember also that the Y axis in a Windows window goes down.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Alexander Chernosvitov

Russian Federation Russian Federation
St-Petersburg State Technical University professor:
 
Lecture on OOP, C# and C++.
 
Microsoft Authorized Educational Center:
 
Lecture on Windows programming with C# and C++.
 
Microsoft Certified Professional (C# Desktop Apps and MFC).
 
Have long practice and experience in finding the right way to formulate and numerically solve differential equations.

Comments and Discussions

 
Suggestionestimate PinmemberMember 1040519015-Nov-13 21:49 
GeneralMy vote of 5 Pinmembermanoj kumar choubey14-Mar-12 4:46 
GeneralAll I have to say is Spirograph PinmemberKeith Vinson10-May-11 8:13 
GeneralMy vote of 5 PinmemberDima Popov3-Nov-10 4:29 
GeneralMy vote of 4 PinmemberMember 448140713-Oct-10 17:41 
GeneralGood.. PinmemberSteppenwolfe16-Jan-10 6:13 
Generalmy vote of 2 PinmemberMaximus Byamukama12-Jan-10 2:13 
Generalvery good Pinmembermanzoni8610-Jan-10 21:26 
thank you for the contribution, and seeing an article about algorithms helps your math insight. keep up the good work
GeneralMy vote of 1 Pinmembergbelov28-Dec-09 21:05 
GeneralRe: My vote of 1 Pinmembericetea9429-Dec-09 5:58 
AnswerContributing to an open source .NET project about cryptography PinmemberMember 189546128-Dec-09 11:41 
GeneralCool PinmemberPierre Nocera28-Dec-09 9:00 
GeneralGood one PinmemberbigRahn28-Dec-09 8:55 
GeneralRe: Good one Pinmemberkonikula28-Dec-09 10:32 
General:: Yeahh PinmemberDIEGO FELDNER28-Dec-09 5:47 
GeneralBravo, very nice PinmemberGreizzerland23-Dec-09 0:47 
GeneralAmazing [modified] PinmemberOmarGamil22-Dec-09 23:50 
GeneralNice PinmemberUroš Šmon22-Dec-09 19:56 
GeneralPure Beaty PinmemberMos Dan - Lucian22-Dec-09 12:17 
GeneralThats pretty cool actually. PinmvpSacha Barber22-Dec-09 5:50 
GeneralIt warms my heart Pinmembersam.hill22-Dec-09 5:12 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.140826.1 | Last Updated 22 Dec 2009
Article Copyright 2009 by Alexander Chernosvitov
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid