zu www.bildungsgueter.de nächster Abschnitt zur Inhaltsübersicht des Kapitels vorheriger Abschnitt

Graphics: Figuren ausmalen

Versuche nun, den fünfeckigen Stern auszumalen, den du bereits früher umrandet hast:

  // Konstanten festlegen
const int anzahlEcken = 5;    //   >= 3
const float mittelpunktswinkel = 360.0f / anzahlEcken;
const float startwinkel = -90.0f;

  // weißen Hintergrund zeichnen
using (SolidBrush pinsel = new SolidBrush(Color.White))
    g.FillRectangle(pinsel, rechteck);

  // Mittelpunkt und Umkreisradius berechnen
int hoehe = rechteck.Height;
int breite = rechteck.Width;
int mittelpunktX = breite / 2;
int mittelpunktY = hoehe / 2;
int halbseite = (hoehe < breite ? hoehe : breite) / 2;
int radius = halbseite - 10;

  // Speicherplatz für Punkte reservieren
PointF[] punkte = new PointF[anzahlEcken];

  // Eckpunkte berechnen
for (int i = 0; i < punkte.Length; i++)
{
    double zentralwinkel = i * mittelpunktswinkel;
    zentralwinkel *= 2;
    double winkel = zentralwinkel + startwinkel;
    double bogen = Math.PI * winkel / 180.0;
    punkte[i].X = (float)(radius * Math.Cos(bogen)) + mittelpunktX;
    punkte[i].Y = (float)(radius * Math.Sin(bogen)) + mittelpunktY;
}

  // Vieleck zeichnen
using (SolidBrush pinsel = new SolidBrush(Color.Firebrick))
{
    g.FillPolygon(pinsel, punkte);
}

Das Programmstück erzeugt diese Zeichnung:

Ausgefüllter fünfzackiger Stern

Das ist überraschend: Es werden zwar die Spitzen des Sterns ausgemalt, das innere Fünfeck des Sterns bleibt aber ungefärbt.

Um den Stern ganz auszumalen, musst du bei Aufruf der Methode FillPolygon() ein zusätzliches Argument angeben, den Füllmodus. Verwende als Füllmodus FillMode.Winding:

  // Konstanten festlegen
const int anzahlEcken = 5;    //   >= 3
const float mittelpunktswinkel = 360.0f / anzahlEcken;
const float startwinkel = -90.0f;

  // weißen Hintergrund zeichnen
using (SolidBrush pinsel = new SolidBrush(Color.White))
    g.FillRectangle(pinsel, rechteck);

  // Mittelpunkt und Umkreisradius berechnen
int hoehe = rechteck.Height;
int breite = rechteck.Width;
int mittelpunktX = breite / 2;
int mittelpunktY = hoehe / 2;
int halbseite = (hoehe < breite ? hoehe : breite) / 2;
int radius = halbseite - 10;

  // Speicherplatz für Punkte reservieren
PointF[] punkte = new PointF[anzahlEcken];

  // Eckpunkte berechnen
for (int i = 0; i < punkte.Length; i++)
{
    double zentralwinkel = i * mittelpunktswinkel;
    zentralwinkel *= 2;
    double winkel = zentralwinkel + startwinkel;
    double bogen = Math.PI * winkel / 180.0;
    punkte[i].X = (float)(radius * Math.Cos(bogen)) + mittelpunktX;
    punkte[i].Y = (float)(radius * Math.Sin(bogen)) + mittelpunktY;
}

  // Vieleck zeichnen
using (SolidBrush pinsel = new SolidBrush(Color.Firebrick))
{
    g.FillPolygon(pinsel, punkte, FillMode.Winding);
}

Das entspricht nun eher den Erwartungen:

Ausgefüllter fünfzackiger Stern (mit Windungsregel gef&uul;llt)

Der Stern ist jetzt vollständig ausgefüllt.


vorheriger Abschnitt zur Inhaltsübersicht des Kapitels nächster Abschnitt