7. Scaling

 

 

Dieses Kapitel soll Ihre Grafikkenntnisse noch etwas ausbauen. Sie haben sich schon mit dem Skalieren von grafischen Darstellungen befasst. Skalierung kommt immer wieder vor, alles muss schlussendlich in ein Fenster eigepasst werden, also lohnt es sich, die Sache etwas genauer anzuschauen. Sie sollen wieder am Beispiel lernen. Hier eine paint() Methode, welche einen Sinus zeichnet:



Bemerkungen:

  1. Es ist günstig, alle Variablen am Anfang zu deklarieren und zu kommentieren.
  2. Ich unterscheide zwischen Koordinaten für Berechnung (double) und solchen für die Zeichnung (int)
  3. Die Skalierung ist eine lineare Transformation mit Addition (Verschiebung) und Multiplikation (Dehnung)
  4. Da drawLine() eine Strecke von einem Punkt zum nächsten zeichnet, muss man sich immer die Werte vom letzten Schritt merken (Old!).
  5. Die Sinus - Funktion liefert in Java die Methode sin() aus der Klasse Math.Siehe nachfolgende Tabelle für weiteres aus der Klasse Math.
Einige Math - Methoden:
(Winkel sind im Bogenmass!)

 Funktion:  Methode:
 Sinus  double Math.sin(double);
 Cosinus  double Math.cos(double); 
 Tangens:   double Math.tan(double);
 Arcus Tangens   double Math.atan(double); 
 Zahl Pi  double Math.PI 
 Zahl e  double Math.E
 e hoch  double Math.exp(double);
 natürlicher Log.  double Math.log(double);
 Quadratwurzel  double Math.squrt(double);

 
Diagramm
  • Öffnen Sie das Projekt LoopTest (Menü "Project" "Set Active Project"), ändern Sie die paint() Methode entsprechend dem Listing oben ab und Sie sollten in etwa die Figur rechts kriegen (Fenstergrösse auf 200 mal 200!).

Aufgaben:

  • Zeichnen Sie den Sinus über zwei Perioden hinweg.
  • Zeichnen Sie den Cosinus und minus Cosinus
  • Zeichnen Sie den Tangens, skalieren Sie so, dass man in y Richtung mehr sieht.
  • Zeichnen Sie die Exponentialfunktion. Wie bringt man den "blöden" Strich am Anfang weg? (Anfangswert!)

Skalierung

Ich habe Sie etwas besch...: Sie haben nicht erlebt, wie mühsam es ist, die Werte für die Skalierung zu finden. Und was geschieht, wenn Sie die Grösse des Fensters verändern? Ausprobieren! So wie bisher skaliert man nur im Notfall. Besser ist es, sich bei der Skalierung auf die Grösse des Fensters zu beziehen. Diese Grösse ist der Java - Buchhaltung natürlich bekannt:

Bestimmung der Fenstergrösse:
 Wert:  Methode:
 Höhe  int getHeight();
 Breite  int getWidth(); 
  • Schreiben Sie die paint() Methode so um, dass die Grösse des Diagramms automatisch der Fenstergrösse angepasst wird. Testen Sie mit verschiedenen Fenstergrössen. Achtung: Veränderung der Fenstergrösse geht noch nicht!
  • Wäre schön, wenn sich die Diagrammgrösse bei laufendem Programm einer veränderten Fenstergrösse anpassen würde. Dazu nachfolgend ein Programmteil ohne jede Erklärung. Fügen Sie ihn vor dem Kommentar "// Add window listener." ein. Am besten kopieren Sie diesen Text von hier direkt in Ihr Programm. Das empfehle ich sonst nicht, denn was man mit Händen getippt hat, bleibt besser hängen!

    // Add component listener.
    this.addComponentListener
    (
      new ComponentAdapter() {
        public void componentResized(ComponentEvent e) {
          repaint();
        }
      }
    );