# Drawing Curvilinear Figures

The program of this section demonstrates the drawing of curvilinear figures. The output of the program is shown below. Theoretically, all drawing to a device context may be achieved through use of the functions:

However, the overhead of making a function call for each pixel is prohibitive. A device context has capabilities of drawing figures for this reason. This example makes use of the function DrawLines to draw a sine curve by estimating it with 1000 points. Many curves can be drawn by approximating with a series of points. This method hints of calculus.

```    void OnPaint(object source, PaintEventArgs e)
{
DeviceContext deviceContext = new DeviceContext(this);

System.Drawing.Size sizeClient = ClientSize;

deviceContext.CurrentPosition = new Point(0,sizeClient.Height/2);
deviceContext.DrawLineTo(sizeClient.Width,sizeClient.Height/2);

Array<Point> SineLines = new Array<Point>();

int NumberOfPoints = 1000;

for (int i=0; i<NumberOfPoints; i++)
SineLines[i] = new Point(i * sizeClient.Width/NumberOfPoints,
(int)(sizeClient.Height/2 * (1 - Math.Sin(2*Maths.Pi*i/NumberOfPoints))));

deviceContext.DrawLines(SineLines);
}
```

Using DrawLines to draw the 1000 points approximating a sine curve is much quicker than making 1000 individual calls to the graphics subsystem. Many mathematical functions may be approximated in this fashion.

Note that the method Gdi::DrawLines accepts an array of points. The class Array is a collection class of considerable importance. Quite a few of the Win+ APIs make use of this class. Dynamic arrays are of such significance that future operating system will make extensive use of them. In a managed environment, there are also system arrays. When creating a system array, the dimension of the array needs to be known in advance. Dynamic arrays have no such restriction.