## #1,149 – Drawing an Arc in a Custom Shape

We can use a StreamGeometryContext to render some geometry in a custom Shape element that we can then use in XAML.  Below is an example that draws a simple arc from 0 degress to 90 degrees.  It uses a PolarPoint class to allow describing the arc start and finish as polar coordinates.  (A future post will allow a user to specify arc start and end).

```    public class Arc : Shape
{
protected override Geometry DefiningGeometry
{
get
{
double maxWidth = RenderSize.Width;
double maxHeight = RenderSize.Height;
double maxRadius = Math.Min(maxWidth, maxHeight) / 2.0;

PolarPoint arcStart = new PolarPoint(maxRadius, 0.0);
PolarPoint arcFinish = new PolarPoint(maxRadius, 90.0);

StreamGeometry geom = new StreamGeometry();
using (StreamGeometryContext ctx = geom.Open())
{
ctx.BeginFigure(
new Point((maxWidth / 2.0) + arcStart.X,
(maxHeight / 2.0) - arcStart.Y),
false,
false);
ctx.ArcTo(
new Point((maxWidth / 2.0) + arcFinish.X,
(maxHeight / 2.0) - arcFinish.Y),
0.0,     // rotationAngle
false,   // greater than 180 deg?
SweepDirection.Counterclockwise,
true,    // isStroked
true);
}

return geom;
}
}
}
```

Using the arc:

```        <loc:Arc Stroke="Black" StrokeThickness="1"
Height="100" Width="100" Margin="5"
HorizontalAlignment="Center"/>
```

## #1,148 – Sample Code to Convert from Polar to Cartesian Coordinates

Below is some simple code (not productized) that can convert from two-dimensional polar to cartesian coordinates.

```    public class PolarPoint
{
// Angle expressed in degrees
{
throw new ArgumentException("Radius must be non-negative");
if ((angleDeg < 0) || (angleDeg >= 360.0))
throw new ArgumentException("Angle must be in range [0,360)");

AngleDeg = angleDeg;
}

// Polar coordinates
public double Radius { get; set; }
public double AngleDeg { get; set; }

// Cartesian coordinates
public double X
{
get { return Radius * Math.Cos(AngleDeg * Math.PI / 180.0); }
}

public double Y
{
get { return Radius * Math.Sin(AngleDeg * Math.PI / 180.0); }
}

public override string ToString()
{
return string.Format("({0},{1})", X, Y);
}
}
```

We can then use this class as follows.

```            Console.WriteLine(new PolarPoint(0.0, 0.0));
Console.WriteLine(new PolarPoint(1.0, 0.0));
Console.WriteLine(new PolarPoint(1.0, 45.0));
Console.WriteLine(new PolarPoint(1.0, 90.0));
Console.WriteLine(new PolarPoint(1.0, 135.0));
Console.WriteLine(new PolarPoint(1.0, 180.0));
```