Universität Hamburg - Fachbereiche - Fachbereich Mathematik

Java-Kurs (8)

WiSe 01/02

Bodo Werner

Zurück zum Inhaltsverzeichnis.

8. Zeichnen von (mehreren) Funktionsgraphen

Die folgenden Grafikprogramme dienen dem Zeichnen von (mehreren) Graphen von reellen Funktionen, von parametrisierten ebenen Kurven und eines Punktfeldes (etwa die Interpolationspunkte) in der Ebene. Sie wurden von Jolanta Bajorska im Jahre 1999 erstellt und sollen als "Black Box" verwendet werden. Sie sollten in das eigene Verzeichnis heruntergeladen werden, ganz entsprechend wie die Java-Programme. Eine "Bedienungsanleitung" schließt sich an.

8.1 Übersicht über die Black-Box-Programme

Die folgenden Dateien enthalten die Java-Klassen (Quellprogramme), die von einer Applikationsklasse benutzt werden, wenn gezeichnet werden soll. Sie können nach Drücken der rechten Maustaste und Auswahl von Save Link as heruntergelden werden. Ich empfehle, alle folgenden Dateien erst einmal in ein gesondertes Verzeichnis zu schreiben, damit die Übersicht nicht verloren geht.

Zunächst die drei (z.T. abstrakten) Klassen Funktion.java (diese Klasse ist wesentlich maechtiger als die bisher besprochenen Klassen Funktion1, Funktion2, ...) ParamKurve.java InterpolPunkte.java, mit deren instanziierten (Unter-)Klassen die entprechenden grafischen Objekte erzeugt werden können. In diesen Klassen werden die folgenden Klassen, bzw. Interfaces verwendet: Grafik.java, Bild.java, MinMax.java, Darstellbar.java.

Die Klasse GIFEncoder.java enthält mehrere technischen Klassen, die erst nach der Compilierung sichtbar werden. Ferner gibt es noch SpeichernDialog.java.

Es gibt die Applikationsklasse Funktionendarstellung.java zum Testen. Sie verwendet die folgenden drei Unterklassen der Klasse Funktion Sinus.java, Wurzel.java, Quadrat.java, die beiden Unterklassen Ellipse.java, Gerade.java der Klasse ParamKurve; ferner wird ein Objekt der Klasse InterpolPunkte in der Applikationsklasse selbst erzeugt.

Um alle grafischen Objekte in einem Fenster zu zeichnen, wird die Klasse Liste in Liste.java benötigt. Als erstes sollte man den Test durch Compilierung von Funktionendarstellung.java machen. Dann sollten sich eine Fülle von neuen *.class-Dateien bilden. Die Ausführung von Funktionendarstellung.class sollte dann zu folgendem Bild führen:


Um eigene Zeichnungen nach dem folgenden Muster zu erstellen, empfehle ich, "nur" die folgenden 16 *.class-Dateien in das aktuelle Verzeichnis zu kopieren: Bild.class, BitFile.class, BitUtils.class, Darstellbar.class, Funktion.class, GIFEncoder.class, Grafik.class, ImageDescriptor.class, InterpolPunkte.class, Liste.class, LZWCompressor.class, LZWStringTable.class, MinMax.class, ParamKurve.class, ScreenDescriptor.class, SpeichernDialog.class

Man kann aber auch ein neues Verzeichnis, z.B. namens EigeneKlassen als Unterverzeichnis von C:\ erstellen, diese 16 Klassen dort hinein kopieren und unter Windows mit dem Kommando SET CLASSPATH=.;C:\EigeneKlassen den Javacompiler zwingen, in diesem und dem aktuellen Verzeichnis nach Klassen zu suchen.

8.2 Zeichnen des Graphen einer Funktion

Dies ist außerordentlich einfach. Man erstellt eine Unterklasse der Klasse Funktion, die die Abbildungsvorschrift in Gestalt der Methode getY() enthält. Der Konstruktor ermöglicht die Übergabe des Intervalls, das der Zeichnung zu Grunde liegt und kann einen namen festsetzen, der in der Zeichnung erscheinen wird.
Wir nehmen als Beispiel die Wurzel-Funktion:
public class Wurzel extends Funktion{
 public Wurzel(double xMin, double xMax){
   super(xMin,xMax);
   Name="Sqrt(x)";
 }

 public double getY(double x){
   return Math.sqrt(x); //negative Eingaben werden nicht abgefangen
 }
}//Ende Wurzel
Dann ist eine Applikationsklasse (wie Funktionendarstellung, aber viel einfacher) zu erstellen, in der ein Objekt der eben geschaffenen Unterklasse instanziert wird. Hier legt man sich auf das Intervall fest:
class ZeichneWurzel{
static void main(String[] args){
 Wurzel f=new Wurzel(0,1); //Intervall ist also [0,1]
 Grafik g= new Grafik(f);
}//Ende main()
}//Ende ZeichneWurzel
Die Initialisierung des Grafik-Objektes g, dem die Funktion f übergeben wird, bewirkt, dass sich ein Grafikfenster mit dem gesuchten Graphen von f öffnet. Interakiv kann danach nur noch die Auflösung geändert werden, etwa um durch Erhöhung ein "glatteres" Bild zu erhalten (wenn die Voreinstellung nicht ausreicht). Danach kann man das Bild als *.gif-File abspeichern, wenn man den Menupunkt Grafik anklickt. Die Endung .gif wird automatisch angefügt. Mit anderen Programmen kann man danach mit Hilfe dieses gif-Files die Grafik ausdrucken oder in einen Text einfügen, z.B. in dieses html-Dokument.

Bei dieser Anwendung muss man neben der Klasse Funktion nur noch die Klasse Grafik namentlich kennen. Alle anderen Klassen arbeiten unbemerkt im Hintergrund.

8.3 Zeichnen zweier Graphen mit ausgezeichneten Punkten

Diese Anwendung kommt bei der numerischen Interpolation zum Tragen, wenn man eine zu interpolierende Funktion, eine Interpolationsfunktion und Interpolationspunkte in der Ebene zeichnen will. Als Beispiel sei die zu interpolierende Funktion wieder die Wurzel-Funktion, die drei Interpolationspunkte seien (0,0),(0.49,0.7) und (1,1), die Interpolationsfunktion sei das zugehörige Interpolationspolynom vom Grade 2. Das Interpolationspolynom werde als Objekt einer Unterklasse namens SpPol von Funktion definiert. Die Applikationsklasse hat dann das folgende Aussehen:
/**
Graphische Darstellung einer zu interpolierenden Funktion, einer
Interpolationsfunktion und von Interpolationspunkten
*/
public class ZeichneInterp{
  public static void main(String[] args){
    Liste fr=new Liste();
    Wurzel f1=new Wurzel(0,1);
    fr.addDarstellbar(f1);

    SpPol f2=new SpPol(0,1);
    fr.addDarstellbar(f2);

    double kX[]={0, 0.49, 1};
    double kY[]={0, 0.7 , 1};
    InterpolPunkte f3=new InterpolPunkte(kX,kY);
    fr.addDarstellbar(f3);

    Grafik g=new Grafik(fr);
  }
}
Hier werden direkt neben den Klassen Funktion, Grafik die Klassen InterpolPunkte, Liste, letztere mit ihrer Methode addDarstellbar() verwendet. Die Grafik sieht dann so aus:
Da wir es mit drei Objekten f1, f2, f3 zu tun haben, aus der die Grafik bestehen soll, ist das Erzeugen einer Grafik etwas komplexer als im ersten Beispiel einer Funktion. Die drei Objekte werden mittels einer Methode addDarstellba() einer Liste namens fr hinzugefügt und dann dem Konstruktor des Grafikobjekts übergeben.

Der Vollständigkeit gebe ich auch die Klasse SpPol.java an:

class SpPol extends Funktion{
public SpPol(double xMin, double xMax){
   super(xMin,xMax);
   Name="Interpolationspolynom";
 }
 public double getY(double x){
   double y=x-0.84033614*x*(x-1) ;
   return y;
 }
}

8.4 Zeichnen einer parametrisierten Kurve

Hier muss eine Unterklasse der Klasse ParamKurve gebildet werden, z.B. eine Ellipse:
public class Ellipse extends ParamKurve{
  public Ellipse(double min, double max){
	super(min, max);
        name="x=2*cos(t), y=4*sin(t)";
  }

  public double getX(double t)
  {return 2*Math.cos(t);}

  public double getY(double t)
  {return 4*Math.sin(t);}
}
Dann kann die folgende sehr kurze Applikationsklasse benutzt werden:
public class ZeichneEllipse{
  public static void main(String[] args){
       Ellipse f1=new Ellipse(0,2*Math.PI);
       Grafik g=new Grafik(f1);
  }
}

8.5 Die wichtigsten Daten und Methoden zum Zeichnen

Hier stelle ich alle diejenigen (öffentlichen!) Daten und Methoden dar, die ein Benutzer dieser Black-Box-Klassen zum Zeichnen kennen sollte.

Weiter mit 9. Einführung in Grafik.