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.