Um eine Folge miteinander verbundener Linien - einen sogenannten Streckenzug oder Polygonzug - zu zeichnen, verwendest du die Funktion DrawLines(). Die Argumente dieser Funktion sind ein Zeichenstift und ein Feld von Punkten, die die Eckpunkte des Polygonzugs bilden.
Im folgenden Beispiel legst du zunächst drei Punkte in der Zeichenfläche fest, um sodann einen aus zwei Strecken bestehenden Polygonzug zu zeichnen:
Rectangle bereich = Rectangle.Inflate(rechteck, -20, -20); // Drei Eckpunkte für einen aus zwei Strecken // bestehenden Streckenzug vorbereiten: Point[] punkte = new Point[3]; punkte[0].X = bereich.Left; punkte[0].Y = bereich.Top; punkte[1].X = bereich.Right; punkte[1].Y = bereich.Top; punkte[2].X = (bereich.Right + bereich.Left) / 2; punkte[2].Y = bereich.Bottom; // roten Zeichenstift erzeugen using (Pen stift = new Pen (Color.Red, 11.0f)) { // Feineinstellung der Stifteigenschaften stift.StartCap = LineCap.Round; stift.EndCap = LineCap.Round; stift.LineJoin = LineJoin.Round; // Polygonzug zeichnen g.DrawLines(stift, punkte); // Stiftfarbe und Strichstärke ändern // und nochmals zeichnen stift.Color = Color.White; stift.Width = 1.0f; g.DrawLines(stift, punkte); }
Hier ist wieder etwas Neues:
stift.LineJoin = LineJoin.Round;
Die Eigenschaft LineJoin bestimmt, wie Linien aneinandergefügt werden. Der Wert LineJoin.Round bedeutet Abrundung der Ecken eines Polygonzuges.
Ebenso wie die Eigenschaften StartCap und EndCap ist auch die Eigenschaft LineJoin nur wichtig, wenn du dicke Linien zeichnest.
Das Beispiel liefert dieses Bild:
Hier sind einige Anmerkungen unbedingt erforderlich:
Alle Punkte eines Polygonzuges müssen vorab in ein Feld eingetragen werden, das anschließend an die Methode DrawLines() übergeben wird. Da Point eine Struktur ist, wird bei der Herstellung eines Feldes von Punkten sogleich auch Speicherplatz für alle im Feld zusammengefassten Punkte reserviert. Die Punkte werden deshalb nicht einzeln durch Aufrufe des Konstruktors
new Point(<x-Koordinate>, <y-Koordinate>)
erzeugt. Stattdessen werden die Punktkoordinaten wie im Beispiel gezeigt einzeln in das Feld eingetragen.
Die beiden ersten Punkte des Polygonzuges liegen auf dem oberen Rand des Rechtecks bereich. Das siehst du daran, dass die y-Koordinaten beider Punkte den Wert bereich.Top haben.
Die x-Koordinate des letzten Punktes liegt in der Mitte des Rechtecks bereich. Für die Bestimmung dieser Koordinate brauchen wir ein bißchen Mathematik. Da gibt es verschiedene Möglichkeiten:
Du kannst die Breite des Rechtecks halbieren und dazu die x-Koordinate des linken Eckpunktes hinzuzählen:
punkte[2].X = bereich.Width / 2 + bereich.Left;
Ich habe im Beispiel geschrieben:
punkte[2].X = (bereich.Right + bereich.Left) / 2;
Tatsächlich ist beides dasselbe:
Erinnere dich, dass gilt:
bereich.Width = bereich.Right - bereich.Left
Zur Abkürzung führe ein:
W = bereich.Width L = bereich.Left R = bereich.Right
Der Rest ist eine Folge einfacher Umformungen:
W/2 + L = | Definition von W einsetzen (R - L)/2 + L = | Klammer auflösen R/2 - L/2 + L = | L zusammenfassen R/2 + L/2 = | Teiler 2 ausklammern (R + L)/2
Und wenn dir das schon zu viel Mathematik ist, findest du Trost in diesem Spruch aus dem 139. Psalm:
Solche Erkenntnis ist mir zu wunderbar und zu hoch; ich kann sie nicht begreifen.