Die "eigentliche" Delphi-Grafik wird über ein Objekt vom Typ "TCanvas" ("canvas" heißt auf deutsch: "Leinwand"!) abgewickelt. All die Delphi-Komponenten, auf denen User-Zeichnungen Sinn machen, haben eine solche Eigenschaft mit Namen Canvas. Für die Ausgabe von Grafiken eignet sich besonders eine PaintBox-Komponente, welche hauptsächlich aus einem "Canvas mit Rand" besteht. Obwohl ein Canvas über viele schöne Zeichenbefehle verfügt (schauen Sie mal in der Online-Hilfe nach!), brauchen Sie für die folgende Aufgabe nur MoveTo(x, y) und LineTo(x, y), wobei die Integer(!)-Koordinaten x und y im Canvas-eigenen Pixel-Koordinatensystem interpretiert werden. Der Befehl zeichnet eine Strecke von der aktuellen Grafik-Cursor-Position zum Punkt Q(x, y). |
Die "eigentliche" Java-Grafik wird über ein Objekt vom Typ "Graphics" abgewickelt. All die Java-Komponenten, auf denen User-Zeichnungen Sinn machen, haben ein solches Graphics-Objekt. Für die Ausgabe von selbsterstellten Grafiken auf der Oberfläche des Programms eignet sich besonders eine Canvas-Komponente, die einen rechteckigen Bereich für programmierte Zeichenoperationen zur Verfügung stellt -- und eben auch ein Graphics-Objekt, das die dazu nötigen Werkzeuge bereitstellt. Obwohl ein Graphics-Objekt über viele schöne Zeichenbefehle verfügt (schauen Sie mal in der Online-Hilfe nach!), brauchen Sie für die folgende Aufgabe zunächst nur einen einzigen, nämlich drawLine(x1, y1, x2, y2), wobei die übergebenen Integer(!)-Koordinaten im Canvas-eigenen Pixel-Koordinatensystem interpretiert werden. Die Anweisung zeichnet eine Strecke vom Punkt P(x1, y1) zum Punkt Q(x2, y2). |
In Delphi:
|
In Java:
|
In Delphi:
function f(x: Double): Double; begin Result := 3*sin(x); end;Die Zeichenaktion soll durch einen Klick auf einen Knopf "Zeichnen" ausgelöst werden. Setzen Sie den Knopf in eine TPanel-Komponente, deren Align-Eigenschaft auf "alTop" gesetzt wird. Die Zeichnung selbst soll in einer TPaintBox-Komponente erstellt werden, deren Align auf "alClient" gesetzt wird, um automatische Skalierbarkeit des Formulars zu erhalten. Um einen weißen Hintergrund zu bekommen, genügt es leider nicht, die Color-Eigenschaft der PaintBox-Komponente auf clWhite zu setzen, da diese Komponente zunächst transparent ist. Daher müssen Sie die Color-Eigenschaft des (darunterliegenden!) Formulars auf clWhite setzen. |
In Java:
public double f(x: Double) { return 3*sin(x); } Die Zeichenaktion soll durch einen Klick auf einen Knopf "Zeichnen" ausgelöst werden. Setzen Sie den Knopf in eine Panel-Komponente, der Sie im Objekt-Inspektor die Höhe 50 (Pixel) zuweisen und sie dann über die gesammte Fensterbreite horizontal aufziehen. Die Zeichnung selbst soll in einer Canvas-Komponente erstellt werden, die den restlichen freien Platz des Formulars belegt. Um einen weißen Hintergrund zu bekommen, genügt es, die Background-Eigenschaft der Canvas-Komponente auf WHITE zu setzen. |
In Delphi deklarieren Sie nun die Variablen x0, y0 und ppcm im "private"-Abschnitt der Formular-Deklaration. Bevor Sie nun die vier oben angegebenen Umrechnungsfunktionen implementieren können, müssen diese drei Variablen mit sinnvollen Werten belegt werden. Dies sollten Sie sinnvollerweise gleich beim Programmstart in der OnCreate-Methode des Formulars erledigen:
x0 := PaintBox1.Width div 2; y0 := PaintBox1.Heigth div 2; ppcm := 40.0;Damit wird der Ursprung des User-Koordinatensystems in die Mitte des Zeichenbereichs geschoben; außerdem wird festgelegt, dass die Einheitsstrecke 40 Pixel lang ist. |
In Java deklarieren Sie nun die Variablen x0, y0 und ppcm als "private" Variablen des Formulars. Bevor Sie nun die vier oben angegebenen Umrechnungsfunktionen implementieren können, müssen diese drei Variablen mit sinnvollen Werten belegt werden. Dies sollten Sie sinnvollerweise gleich beim Programmstart im Konstruktor des Formulars erledigen. Fügen Sie dazu am Ende des Konstruktor-Quelltextes die folgenden Anweisungen hinzu:
x0 = canvas1.getWidth() / 2; y0 = canvas1.getHeigth() / 2; ppcm = 40.0;Damit wird der Ursprung des User-Koordinatensystems in die Mitte des Zeichenbereichs geschoben; außerdem wird festgelegt, dass die Einheitsstrecke 40 Pixel lang ist. |
Deklarieren Sie in Delphi entsprechende Double-Variablen xmin, xmax, ymin und ymax im "private"-Abschnitt der Formular-Deklaration, und setzen Sie sie in der OnCreate-Methode auf die korrekten Werte:xmin := userx(0); xmax := userx(Paintbox1.Width); ymin := usery(Paintbox1.Height); ymax := usery(0); |
Deklarieren Sie in Java entsprechende double-Variablen xmin, xmax, ymin und ymax als "private" Variablen des Formulars, und setzen Sie sie in im Formular-Konstruktor direkt nach der Initialisierung von x0, y0 und ppcm auf die korrekten Werte:xmin = userx(0); xmax = userx(canvas1.getWidth()); ymin = usery(canvas1.getHeight()); ymax = usery(0); |
In Delphi sind die Zeichenbefehle als Methoden von Paintbox.Canvas implementiert. Um Schreibarbeit zu sparen, können Sie den Canvas in einer lokalen Variablen c zwischenspeichern:
procedure TForm1.Button1Click(Sender: TObject); var c : TCanvas; begin c := Paintbox1.Canvas; c.MoveTo(paintx(xmin), painty(0)); c.LineTo(paintx(xmax), painty(0)); c.MoveTo(paintx(0), painty(ymin)); c.LineTo(paintx(0), painty(ymax)); end; |
In Java sind die eigentlichen Zeichen-Befehle in einem Graphics-Objekt versteckt, das man sich erst vom Canvas-Objekt geben lassen muss:
public void button1_ActionPerformed(ActionEvent evt) { Graphics g = canvas1.getGraphics(); g.drawLine(paintx(xmin), painty(0), paintx(xmax), painty(0)); g.drawLine(paintx(0), painty(ymin), paintx(0), painty(ymax)); } |
Für Delphi:
c.MoveTo(paintx(-3), painty( 0.2)); c.LineTo(paintx(-3), painty(-0.2));Erzeugen Sie in einer Schleife, die von Round(xmin) bis Round(xmax) läuft, alle nötigen Skalierungsstriche auf der x-Achse. Erzeugen Sie danach analog die Skalierung der y-Achse. Richtige Profis schreiben dann noch die Zahlen an die Skalierungsstriche. Benutzen Sie dazu die Canvas.TextOut()-Methode! Details dazu finden Sie in der Online-Hilfe zu Delphi. |
Für Java:
g.drawLine(paintx(-3), painty( 0.2), paintx(-3), painty(-0.2));Erzeugen Sie in einer Schleife, die von ((int) xmin) bis ((int) xmax) läuft, alle nötigen Skalierungsstriche auf der x-Achse. Erzeugen Sie danach analog die Skalierung der y-Achse. Richtige Profis schreiben dann noch die Zahlen an die Skalierungsstriche. Benutzen Sie dazu die Graphics.drawString()-Methode! Details dazu finden Sie in der Online-Hilfe zu Java. |
Deklarieren Sie zunächst zwei lokale Variablen x und y, sowie eine Schrittweite dx, alles als Double. Arbeiten Sie sich dann von x = xmin aus in kleinen Schritten der Weite dx bis zu x >= xmax vor; berechnen Sie für jedes x das zugehörige y := f(x) und zeichnen Sie mit einem LineTo-Befehl stückchenweise das Schaubild. (Achtung! Vor dem Start der Schleife muss ein MoveTo-Befehl den Grafik-Cursor an die "richtige" Stelle schieben!) |
Deklarieren Sie zunächst zwei lokale Variablen x und y, zwei weitere namens x_a und y_a, in denen die "alten" Werte aufgehoben werden, sowie eine Schrittweite dx, alles als double. Arbeiten Sie sich dann von x = xmin aus in kleinen Schritten der Weite dx bis zu x >= xmax vor; berechnen Sie für jedes x das zugehörige y = f(x), und zeichnen Sie mit einem drawLine()-Befehl stückchenweise das Schaubild. (Achtung! Da jeder drawLine()-Befehl einen Start- und einen Endpunkt braucht, müssen Sie sich genau überlegen, wie sie hier vorgehen wollen!) |