Vollschlanke Linien zeichnen
Mit den Möglichkeiten von Java 1.2 lassen sich dickere Linien zeichnen. Mit Java 1.1 muss man zu Tricks greifen.
In Zeichenprogrammen und grafischen Präsentationen besteht häufig die Notwendigkeit, die sonst nur dünnen Standardlinien etwas aufzupusten. Es sind also dickere Linien erwünscht, und dies führt zu vielfältigen Problemen, die spontan nicht ersichtlich sind. Zunächst kommt die Frage nach der Zeichentechnik. Die erste Möglichkeit ist, mehrere Linien übereinander zu zeichnen. Dieser Ansatz ist auf den ersten Blick der einfachste, doch ein zweiter Blick auf die Grafik zeigt, dass einige Löcher entstehen; die Linien sind nicht genau übereinander. Dies liegt an den Rechenfehlern der Linienfunktion. Diese Lösung scheidet somit aus, und wir entscheiden uns für einen Linienzug, der gefüllt wird. Dies ist der einzige Ausweg. Nur ist diese Lösung nicht besonders schnell. Denn erst muss der Linienzug gezeichnet werden, und anschließend folgt eine kostspielige Füllfunktion. Doch Probleme mit Löchern gibt es nicht. Etwaigen Schwierigkeiten, wie etwa ein zwei Pixel hoher Polygonzug, in dem eigentlich kein Platz mehr ist, muss mit der Leistungsfähigkeit der Füllmethode begegnet werden.
Das zweite Problem betrifft das Ende der Linien. Sollen diese abgerundet, spitz wie ein Pfeil oder wie eine Rampe aussehen? Oder soll die Linie, die dann entsteht, einfach wie ein gedrehtes Rechteck aussehen? Ein Blick in die Grafikbibliotheken von Windows oder X11 zeigt, dass hier viele Arten existieren. Unsere folgende Funktion ist aber sehr einfach gebaut. Sie rundet nicht ab, sondern zeichnet das gedrehte Rechteck. Eine dritte Unsicherheit liegt in der Definition der Endpunkte. Ist eine Linie zehn Pixel breit, so muss sichergestellt werden, wo denn der Startpunkt liegt. Liegt er in der Mitte oder, wenn etwa die Ränder mit einer Spitze gezeichnet sind, an diesen Punkten? Da unsere Methode sehr einfach ist, kümmern wir uns nicht darum und lassen die Endpunkte mittig liegen.
public static void drawThickLine( int x, int y,
int x2, int y2,
int thickness, Graphics g )
{
int b = Math.round( thickness /2), deltax, deltay;
double angle;
//if (y2==y) alpha = 0; else
angle = Math.atan( (double)((y2-y)/(x2-x)) );
deltay = (int) Math.round( (Math.cos(angle)*b) );
deltax = (int) Math.round( (Math.sin(angle)*b) );
Polygon p = new Polygon();
p.addPoint( x - deltax, y + deltay );
p.addPoint( x + deltax, y - deltay );
p.addPoint( x2 + deltax, y2-deltay );
p.addPoint( x2 - deltax, y2+deltay );
g.fillPolygon( p );
}
Aus der Beschreibung am Anfang geht hervor, dass das Zeichnen von dicken Linien mit den gewünschten Zusätzen wie Rändern keine triviale Aufgabe ist. Schön ist, dass sich unter der Java-2-Plattform die Java-2D-API um diese Aufgabe kümmert.