/// <summary>
/// Zeichnet einen Stern.
/// </summary>
/// <param name="g">Das Graphics-Objekt, auf ds gezeichnet werden soll.</param>
/// <param name="count">Die Anzahl der Spitzen des Sterns. (>=3)</param>
/// <param name="center">Der Mittelpunkt des Sterns.</param>
/// <param name="innerRad">Der innere Radius des Sterns.(>=1)</param>
/// <param name="outerRad">Der äußere Radius des Sterns(>=1)</param>
/// <param name="degree">Die Grad, um die der Stern gedreht werden soll (0~359,9)</param>
/// <param name="pen">Die Rahmenfarbe des Sterns.</param>
/// <exception cref="System.ArgumentOutOfRangeException">Tritt ein, wenn einer der numerischen Parameter außerhalb, des in der Beschreibung angegebenen, Bereichs ist.</exception>
public static void DrawStar(this Graphics g, int count, Point center, int innerRad, int outerRad, double degree, Pen pen)
{
g.DrawPolygon(pen, GetStarPoints(count, center, innerRad, outerRad, degree));
}
/// <summary>
/// Zeichnet einen gefüllten Stern.
/// </summary>
/// <param name="g">Das Graphics-Objekt, auf ds gezeichnet werden soll.</param>
/// <param name="count">Die Anzahl der Spitzen des Sterns. (>=3)</param>
/// <param name="center">Der Mittelpunkt des Sterns.</param>
/// <param name="innerRad">Der innere Radius des Sterns.(>=1)</param>
/// <param name="outerRad">Der äußere Radius des Sterns(>=1)</param>
/// <param name="degree">Die Grad, um die der Stern gedreht werden soll (0~359,9)</param>
/// <param name="brush">Die Füllfarbe des Sterns.</param>
/// <exception cref="System.ArgumentOutOfRangeException">Tritt ein, wenn einer der numerischen Parameter außerhalb, des in der Beschreibung angegebenen, Bereichs ist.</exception>
public static void DrawStar(this Graphics g, int count, Point center, int innerRad, int outerRad, double degree, Brush brush)
{
g.FillPolygon(brush, GetStarPoints(count, center, innerRad, outerRad, degree));
}
#region Hilfsmethoden
/// <summary>
/// Gibt die Eckpunkte für den Stern zurück.
/// </summary>
private static PointF[] GetStarPoints(int count, Point center, int innerRad, int outerRad, double degree)
{
if (count < 3)
throw new ArgumentOutOfRangeException("count", "count > 3");
if (degree < 0 || degree >= 360)
throw new ArgumentOutOfRangeException("degree", "0 <= degree < 360");
if (innerRad < 1)
throw new ArgumentOutOfRangeException("innerRad", "0 < innerRad");
if (outerRad < 1)
throw new ArgumentOutOfRangeException("outerRad", "0 < outerRad");
while (degree >= 360 / count)
degree -= 360 / count;
List<PointF> points = new List<PointF>();
for (int i = 0; i < count; ++i)
{
PointF p1 = PointF.Empty, p2 = PointF.Empty;
double d = 360d / (double)count * i + degree;
points.Add(GetStarPoint(center, d, outerRad));
d += 180 / count;
if (d >= 360)
d -= 360;
points.Add(GetStarPoint(center, d, innerRad));
}
return points.ToArray();
}
/// <summary>
/// Gibt einen Punkt des Sterns zurück.
/// </summary>
/// <param name="center">Das Zentrum des Sterns</param>
/// <param name="d">Der Punkt auf der Kreisbahn, zwischen einschließlich 0° und 360°.</param>
/// <param name="io">Der Radius der Kreisbahn</param>
private static PointF GetStarPoint(PointF center, double d, int io)
{
PointF p = PointF.Empty;
if (d == 0)
p = new PointF(center.X, (float)(center.Y - io));
else if (d < 90)
p = new PointF(center.X + (float)(Math.Cos((90 - d) / 180 * Math.PI) * io),
center.Y - (float)(Math.Sin((90 - d) / 180 * Math.PI) * io));
else if (d == 90)
p = new PointF((float)(center.X + io), center.Y);
else if (d < 180)
p = new PointF(center.X + (float)(Math.Sin((180 - d) / 180 * Math.PI) * io),
center.Y + (float)(Math.Cos((180 - d) / 180 * Math.PI) * io));
else if (d == 180)
p = new PointF(center.X, center.Y + io);
else if (d < 270)
p = new PointF(center.X - (float)(Math.Cos((270 - d) / 180 * Math.PI) * io),
center.Y + (float)(Math.Sin((270 - d) / 180 * Math.PI) * io));
else if (d == 270)
p = new PointF((float)(center.X - io), center.Y);
else if (d < 360)
p = new PointF(center.X - (float)(Math.Sin((360 - d) / 180 * Math.PI) * io),
center.Y - (float)(Math.Cos((360 - d) / 180 * Math.PI) * io));
return p;
}
#endregion