Grafikprogrammierung ist wirklich mühsam, wenn man jeden Punkt und jeden Strich einzeln angeben muss. So hast du das bisher meist gemacht. Lediglich im zuletzt besprochenen Beispiel hast du die Eckpunkte eines regulären Vielecks unter Verwendung einer Formel in einer Wiederholungsanweisung ausgerechnet.
Computergrafik bezieht einen großen Teil ihrer Leistungsfähigkeit aus der geschickten Verwendung von Wiederholungsanweisungen. Das wollen wir uns gleich an einem weiteren Beispiel ansehen:
Wenn du parallel in gleichem Abstand verlaufende Linien zeichen willst, kannst du die Berechnung der Linienendpunkte und das Zeichnen der Linien in einer wohlüberlegt programmierten Schleifenanweisung ausführen. Das sieht dann so aus:
Rectangle bereich = Rectangle.Inflate(rechteck, -20, -20); float deltaX = bereich.Width / 10.0f; using (Pen stift = new Pen (Color.Gray, 1.0f)) { stift.StartCap = LineCap.Flat; stift.EndCap = LineCap.Flat; for (int i = 0; i <= 10; i++) { int xPosition = (int)(deltaX*i + bereich.Left); g.DrawLine(stift, xPosition, bereich.Top, xPosition, bereich.Bottom); } }
Das gibt elf parallele Linien:
Ein paar Anmerkungen zu diesem Programm:
Der eigentliche Zeichenbereich wird durch das Rechteck bereich dargestellt; dieses Rechteck wird aus dem Darstellungsbereich der Zeichenebene durch Verkleinerung gewonnen.
Die Breite des Rechtecks bereich wird durch 10 geteilt. Damit können wir das Rechteck in 10 senkrecht verlaufende Streifen aufteilen.
Um die Aufteilung des Rechtecks bereich in 10 Streifen zu zeichnen, brauchst du 11 Linien! Das erklärt, warum es in der Schleifenanweisung heißt
for (int i = 0; i <= 10; i++)
Die Schleife durchläuft die Werte von 0 bis einschließlich 10. Das sind 11 Werte.
Weil es so schön ist, geben wir jetzt noch die waagrechten Linien dazu, um ein Gitter zu erhalten:
Rectangle bereich = Rectangle.Inflate(rechteck, -20, -20); float deltaX = bereich.Width / 10.0f; float deltaY = bereich.Height / 10.0f; using (Pen stift = new Pen (Color.Gray, 1.0f)) { stift.StartCap = LineCap.Flat; stift.EndCap = LineCap.Flat; for (int i = 0; i <= 10; i++) { int xPosition = (int)(deltaX*i + bereich.Left); g.DrawLine(stift, xPosition, bereich.Top, xPosition, bereich.Bottom); int yPosition = (int)(deltaY * i + bereich.Top); g.DrawLine(stift, bereich.Left, yPosition, bereich.Right, yPosition); } }
Das gibt ein Gitter:
Das ist jetzt nicht mehr bloße Spielerei - diesen Code kannst du verwenden, wenn du für ein Diagramm ein Gitternetz zeichnen willst. In einem Diagramm wirst du die Achsen des Gitters natürlich noch mit Zahlenwerten beschriften wollen, aber das ist nicht schwer. Du wirst später in diesem Kurs lernen wie das geht.