Feedback

C# - Stern in GDI+

Veröffentlicht von am 01.05.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.
GFU-Schulungen  [Anzeige]

VB.NET Einführung

Die Schulung zeigt Ihnen, wie Sie einfache, benutzerorientierte Programme, die auf Datenbanken zugreifen, in VB.NET eigenständig entwickeln. 

ASP.NET Core Server- und Client-Programmierung

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

        /// <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!