Draw an epitrochoid in C#



An epitrochoid is traced out by a point P attached to a circle of radius b rolling around a circle of radius a. (See the figure on the right.)

The shape is drawn by the following parametric equations:

To trace out the entire curve, the values passed into the Sin and Cos functions must start at 0 and end at a multiple of 2 * Pi. That means both t and (a + b) / b * t must end at a multiple of 2 * Pi. That happens if t ranges to b * 2 * Pi. (This assumes a and b are whole numbers.)

The following code shows the PictureBox's Paint event handler.

// Draw the epitrochoid.
private void picCanvas_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.Clear(picCanvas.BackColor);

// Scale and center.
float scale = Math.Min(
picCanvas.ClientSize.Width * 0.45f,
picCanvas.ClientSize.Height * 0.45f);
e.Graphics.ScaleTransform(scale, scale);
e.Graphics.TranslateTransform(
picCanvas.ClientSize.Width / 2,
picCanvas.ClientSize.Height / 2,
System.Drawing.Drawing2D.MatrixOrder.Append);

// Draw the curve.
float a = float.Parse(txtA.Text);
float b = float.Parse(txtB.Text);
float h = float.Parse(txtH.Text);
DrawEpitrochoid(e.Graphics, a, b, h, 0.05f);
}

This code applies scale and translation transformations to the Graphics object so the result is as large as possible while still fitting in the PictureBox and so it is centered. It then parses the a, b, and h parameters and calls the following DrawEpitrochoid method to draw the curve.

// Draw the curve on the indicated Graphics object.
private void DrawEpitrochoid(Graphics gr, float a, float b, float h, float dt)
{
// Calculate the stop value for t.
float stop_t = (float)(b * 2 * Math.PI);

// Find the points.
using (Pen the_pen = new Pen(Color.White, 0))
{
PointF pt0, pt1;
pt0 = new PointF(X(a, b, h, 0), Y(a, b, h, 0));
for (float t = dt; t <= stop_t; t += dt)
{
pt1 = new PointF(X(a, b, h, t), Y(a, b, h, t));
gr.DrawLine(the_pen, pt0, pt1);
pt0 = pt1;
}
}
}

This code calculates a stopping value for t. It then makes points where t runs from 0 to stop_t and connects them.

For more information about epitrochoids, see Wolfram MathWorld.

   

 

What did you think of this article?




Trackbacks
  • No trackbacks exist for this post.
Comments
  • No comments exist for this post.
Leave a comment

Submitted comments are subject to moderation before being displayed.

 Name

 Email (will not be published)

 Website

Your comment is 0 characters limited to 3000 characters.