prev up inhalt next

Trigonometrische Funktionen

Die $x$- und $y$-Koordinaten ergeben sich sofort, wenn man die trigonometrischen Funktionen Sinus und Cosinus benutzt:


\begin{displaymath}
x = r \cdot \cos(\alpha); \qquad y = r \cdot \sin(\alpha) \;\; \alpha \in
\left [ 0;2\pi \right ]
\end{displaymath}

Als Zahl der Schritte für $\alpha$ bietet sich die Zahl der Längeneinheiten des Kreisumfanges an:


\begin{displaymath}
Winkelschritt = \frac{2\pi}{2\pi \cdot r} = \frac{1}{r}
\end{displaymath}

Entsprechend sieht die draw-Methode der Klasse TriCalcCircle.java aus:

public void draw(CGCanvas cgc) {
  double step = 1.0 / (double)r;               // Soviele Winkelschritte
                                               // machen, wie der Umfang
                                               // Einheiten lang ist

  for(double winkel = 0.0; winkel < 2*Math.PI; winkel+=step) {
    cgc.setPixel((int)(x + r*Math.sin(winkel) + 0.5),
                 (int)(y + r*Math.cos(winkel) + 0.5));
  }
}

Der ständige Aufruf der trigonometrischen Funktionen kostet sehr viel Zeit. Eine Möglichkeit diesen Aufwand zu reduzieren, besteht darin, eine Tabelle von Sinus- und Cosinus-Werten anzulegen. Dies wird in der Klasse TriTableCircle getan:

package circle;

public class TriTableCircle extends Circle {
                                                 // Arrays fuer Sinus- und
                                                 // Cosinus-Werte.
  protected final static double[] sin = new double[360];
  protected final static double[] cos = new double[360];
  protected static boolean initialized = false;  // Flagge fuer 1. Instanz

  public TriTableCircle(int x, int y, int r) {
    super(x, y, r);
    if(!initialized) {                           // Falls dies 1. Instanz
      double step = Math.PI / 180;               // Arrays fuellen
      double winkel;

      for(int i=0; i<360; i++) {
        winkel = step * (double)i;
        sin[i] = Math.sin(winkel);
        cos[i] = Math.cos(winkel);
      }
      initialized = true;                        // Fuellung vermerken
    } 
  }

  public void draw(CGCanvas cgc) {
    double step = Math.PI / 180;                 // Immer 360 Schritte

    for(int winkel = 0; winkel < 360; winkel++) {
      cgc.setPixel((int)(x + r*sin[winkel] + 0.5),
                   (int)(y + r*cos[winkel] + 0.5));
    }
  }
}

Durch die feste Zahl von 360 Schritten für jeden (noch so kleinen/großen) Kreis, geht ein Teil der gewonnenen Zeit wieder verloren bzw. entstehen Pixel, die nicht benachbart sind.


prev up inhalt next