Feedback

C# - Stern in GDI+

Veröffentlicht von am 5/1/2013
(2 Bewertungen)
Ich wollte eine Methode schreiben, die einen Stern in GDI+, also in WinForms zeichnen kann. Dabei kamen diese hier heraus.

Es kann die Anzahl der "Spitzen", der äußere Radius, der innere Radius, der Mittelpunkt des Sterns, die Füll/Rahmenfarbe sowie die Drehung festgelegt werden.
        /// <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

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!