## Introduction

Visual C# provides a powerful GDI+ class library interface that allows users to draw various graphics objects.

This article shows you how to create a US flag using C# and GDI+. The US flag contains 50 star polygons and several rectangles.

## Background

Polygon is one of the most important graphics objects we are dealing with when rendering 2D and 3D graphics or processing computational geometry. `Graphics.DrawPolygon `

method draws a polygon defined by an array of point structures. Every pair of two consecutive points in the array specifies a side of the polygon.

Here, I will show you how to create a US flag object. First we need to define the coordinates of a star. As illustrated in the following figure, suppose that the center coordinates of the star are at (xc, yc), r1 is the radius of the inner circle, and r is the radius of the outer circle. The angles a = 72 degrees and ß = 36 degrees.

From this figure, we can easily determine the coordinates of points 0 to 9, as listed in the following table:

Points | x coordinates | y coordinates |

0 | xc | yc – r |

1 | xc + r1 sinß | yc – r1 cosß |

2 | xc + r sina | yc – r cosa |

3 | xc + r1 sina | yc + r1 cosa |

4 | xc + r sinß | yc + r cosß |

5 | xc | yc + r1 |

6 | xc – r sinß | yc + r cosß |

7 | xc – r1 sina | yc + r1 cosa |

8 | xc – r sina | yc – r cosa |

9 | xc – r1 sinß | yc – r1 cosß |

We first implement a `DrawStar `

method to draw a single star polygon at the center position (xc, yc) with a size control parameter r (the radius of the outer circle, as shown in the above figure). We then add a `DrawFlag `

method that first draws seven red strips on a white rectangle background. Note that the respect ratio of the flag is maintained by setting:

float height = 10 * width / 19;

The method then draws the blue rectangle with proper size. Finally we put fifty stars on the blue rectangle uniformly by calling the `DrawStar `

method to finish the project.

## Using the Code

The US flag is really drawn by overriding the `OnPaint `

method of the `Form1 `

class:

protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
DrawFlag(g, 20, 20, this.Width - 50);
g.Dispose();
}

Building and running this project produces the following screenshot:

This is just for fun, perhaps even useful. This project is from the examples of the new book "Practical C# Charts and Graphics", where you can find more advanced chart and graphics programming for real-world .NET applications. For more information, please visit my website.

## About the Author

Dr. Jack Xu has a Ph.D in theoretical physics. He has over 15 years programming experience in Basic, Fortran, C, C++, Matlab, and C#, specializing in numerical computation methods, algorithms, physical modeling, computer-aided design (CAD) development, graphics user interface, and 3D graphics. Currently, he is responsible for developing commercial CAD tools based on Microsoft .NET Framework.

Please read my other articles: