newton.java
来自「分形算法的Java程序」· Java 代码 · 共 146 行
JAVA
146 行
import java.applet.Applet;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Event;
import java.awt.Rectangle;
import java.awt.Image;
import java.awt.image.ImageProducer;
import java.awt.image.ImageConsumer;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
public class Newton extends Applet implements ImageProducer, Runnable
{
protected int maxt = 50;
public int step = 1;
public Cmplx c = null;
public Cmplx tl = new Cmplx(-1.5,1.5), br = new Cmplx(1.5,-1.5);
public Czoom czoom;
Thread drawThread;
boolean killThread = false;
ColorModel cm = new DirectColorModel(9, 3, 16, 30);
ImageConsumer ic;
Rectangle imgSize;
public void init()
{
String s;
double r = 0.0, i = 0.0;
c = new Cmplx(r, i);
czoom = new Czoom(this);
czoom.updateImage();
setLayout(new BorderLayout());
add("Center", czoom);
}
public boolean action(Event e)
{
switch (e.id)
{
case Event.WINDOW_DESTROY:
System.exit(0);
return true;
default:
return false;
}
}
public Cmplx transform(Cmplx z, Cmplx c)
{
return new Cmplx().sqr(z).add(c);
}
public Cmplx initz()
{
return new Cmplx(0.0, 0.0);
}
public int pixelColour(Cmplx pixel) {
Cmplx z = null;
int it = 0;
z = initz();
do {
it++;
z = transform(z, pixel);
} while ( (z.modsq() <= 0.005) && (it <= maxt) );
return it;
}
public synchronized void addConsumer(ImageConsumer ic) {
this.ic = ic;
}
public synchronized boolean isConsumer(ImageConsumer ic) {
return (ic == this.ic);
}
public synchronized void removeConsumer(ImageConsumer ic) {
if (this.ic == ic) {
this.ic = null;
}
}
public void startProduction(ImageConsumer ic) {
imgSize = czoom.bounds();
this.ic = ic;
this.ic.setDimensions(imgSize.width, imgSize.height);
this.ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT |
ImageConsumer.COMPLETESCANLINES |
ImageConsumer.SINGLEFRAME);
drawThread = new Thread(this, "Draw Fractal");
killThread = false;
drawThread.start();
}
public void requestTopDownLeftRightResend(ImageConsumer ic) {
}
public Cmplx translate(int x, int y) {
return new Cmplx(
tl.real() + (double)x / imgSize.width * (br.real() - tl.real()),
tl.imag() + (double)y / imgSize.height * (br.imag() - tl.imag()));
}
public void run() {
int scanLine[] = new int[imgSize.width];
int i, j, clr, num;
Cmplx pixel, z;
for (j=0; j < imgSize.height; j+= step) {
for (i=0; i < imgSize.width; i+= step) {
pixel = translate(i, j);
clr = pixelColour(pixel);
if (clr == -1)
for (num=0; num < step && i+num < imgSize.width; num++)
scanLine[i + num] = 0;
else
for (num=0; num < step && i+num < imgSize.width; num++)
scanLine[i + num] = (clr - 1) % 255 + 1;
if (i%5 == 0) {
drawThread.yield();
if (killThread) {
killThread = false;
ic.imageComplete(ImageConsumer.STATICIMAGEDONE);
return;
}
}
}
for (num=0; num < step && j+num < imgSize.height; num++)
ic.setPixels(0, j+num, imgSize.width, 1,
cm, scanLine, 0, imgSize.width);
}
showStatus("分形频道:www.fractal.cn");
ic.imageComplete(ImageConsumer.STATICIMAGEDONE);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?