Die
- und
-Koordinaten ergeben sich sofort, wenn man die
trigonometrischen Funktionen Sinus und Cosinus benutzt:
Als Zahl der Schritte für
bietet sich die Zahl der
Längeneinheiten des Kreisumfanges an:
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.