Hallo Christoph
Erklärt ist ja jetzt schon. Auch wenn bei schnellem Scrollen paint nicht für jeden Pixel aufgerufen wird, wird es auf jeden fall sehr oft aufgerufen.
Ich habe das Applet mal etwas umgeschrieben:
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.applet.Applet;
public class julia extends Applet implements Runnable {
Thread drawThread = null;
int h, b;
int tiefe = 16;
double o = 1.0, u = -1.0, l = -1.75, r = 1.75;
double c_x = -0.75543, c_y = 0.12301;
boolean drawing = false;
byte map[][];
Graphics g;
BufferedImage i;
public void start() {
i = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
g = i.getGraphics();
g.setColor(new Color(0, 0, 160));
drawThread = new Thread(this);
drawThread.start();
}
public void stop() {
drawThread = null;
g = null;
}
int tempx(double x) {
return (int)((double)(x - l) / (r - l) * b);
}
int tempy(double y) {
return (int)((double)(y - o) / (u - o) * h);
}
public void paint (Graphics g) {
g.drawImage(i,0,0,new Color(238, 238, 238),null);
}
public void run() {
Rectangle rect = getBounds();
drawing = true;
h = rect.height;
b = rect.width;
map = new byte[b][h];
zeichnen(1.0, 1.0);
map = null;
drawing = false;
}
void zeichnen(double x, double y) {
double r, neux, neuy;
int num;
int xtmp = tempx(x), ytmp = tempy(y);
map[xtmp][ytmp]++;
g.drawLine(xtmp, ytmp, xtmp, ytmp);
drawThread.yield();
if (map[xtmp][ytmp] < tiefe) {
x -= c_x; y -= c_y;
r = Math.sqrt(x*x + y*y);
num = (y>0)?1:(y<0)?-1:0;
neux = Math.sqrt((r + x) / 2);
neuy = Math.sqrt((r - x) / 2) * num;
zeichnen(neux, neuy);
zeichnen(-neux, -neuy);
}
repaint(xtmp,ytmp,1,1);
/* Wenn man das hier raus nimmt, flimmert das bild nicht mehr.
Allerdings sieht man auch nicht, wie das Fraktal sich aufbaut.
Wenn man das will, sollte man sich hier etwas optimaleres überlegen. evt. all 100ms neu repaint() o.ä.
*/
}
}
Grüße
Daniel