java 虚部_java经典算法一例

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

public class C extends Applet implements MouseListener, MouseMotionListener

{

private final int MAX = 256;

private final double SX = -1.0; // 实部的最小值

private final double SY = -1.5; // 虚部的最小值

private final double EX = 2.0; // 实部的最大值

private final double EY = 1.5; // 虚部的最大值

private static int picX, picY, xs, ys, xe, ye;

private static double x1, y1, x2, y2, p, q,xb,yb;

private static boolean action, rechteck, fertig, stopit;

private static float xy;

private Image bild;

private Graphics g1;

private Cursor c1, c2;

public void init() // 初始化所有实例

{

p = -0.46;

q = 0.57;

fertig = false;

addMouseListener(this);

addMouseMotionListener(this);

c1 = new Cursor(Cursor.WAIT_CURSOR);

c2 = new Cursor(Cursor.CROSSHAIR_CURSOR);

picX = getSize().width;

picY = getSize().height;

xy = (float)picX / (float)picY;

bild = createImage(picX, picY);

g1 = bild.getGraphics();

fertig = true;

}

public void destroy() // 删除所有实例

{

if (fertig)

{

removeMouseListener(this);

removeMouseMotionListener(this);

bild = null;

g1 = null;

c1 = null;

c2 = null;

System.gc();

}

}

public void start()

{

action = false;

rechteck = false;

stopit = false;

startwerte();

xb = (x2 - x1) / (double)picX;

yb = (y2 - y1) / (double)picY;

julia();

}

public void stop()

{

}

public void paint(Graphics g)

{

update(g);

}

public void update(Graphics g)

{

g.drawImage(bild, 0, 0, this);

if (rechteck)

{

g.setColor(Color.white);

if (xs < xe)

{

if (ys < ye) g.drawRect(xs, ys, (xe - xs), (ye - ys));

else g.drawRect(xs, ye, (xe - xs), (ys - ye));

}

else

{

if (ys < ye) g.drawRect(xe, ys, (xs - xe), (ye - ys));

else g.drawRect(xe, ye, (xs - xe), (ys - ye));

}

}

}

private void julia() // 计算所有的点

{

int x, y;

float h, b, alt = 0.0f;

action = false;

setCursor(c1);

showStatus("正在计算julia集,请等待...");

p = -0.46;

q = 0.57;

for (x = 0; x < picX; x+=2) {

for (y = 0; y < picY; y++)

{

h = punktfarbe(x1 + xb * (double)x, y1 + yb * (double)y,p,q); // 颜色值

if (h != alt)

{

b = 1.0f - h * h;

g1.setColor(Color.getHSBColor( h,1,b));

alt = h;

}

g1.drawLine(x, y, x + 1, y);

}

showStatus( "At " + x + " of " + picX );

if (stopit) x = picX;

}

if (stopit) {

showStatus("Aborted");

stopit = false;

} else {

showStatus("julia集已准备好,请用鼠标选择放大区域.");

}

setCursor(c2);

action = true;

}

// 由迭代产生的0.0到1.0的颜色值

private float punktfarbe(double x0, double y0,double p,double q)

{

double r = 0.0, xk = 0, yk = 0;

int j = 0;

while ((j < MAX) && (r < 4.0))

{

xk = x0 * x0 - y0 * y0 + p;

yk = 2.0 * x0 * y0 + q;

j++;

r = yk * yk + xk * xk;

x0 = xk;

y0 = yk;

}

return (float)j / (float)MAX;

}

private void startwerte() // 重新开始值

{

x1 = SX;

y1 = SY;

x2 = EX;

y2 = EY;

if ((float)((x2 - x1) / (y2 - y1)) != xy )

x1 = x2 - (y2 - y1) * (double)xy;

}

public void mousePressed(MouseEvent e)

{

e.consume();

if (action)

{

xs = e.getX();

ys = e.getY();

}

}

public void mouseReleased(MouseEvent e)

{

int z, w;

e.consume();

if (action)

{

xe = e.getX();

ye = e.getY();

if (xs > xe)

{

z = xs;

xs = xe;

xe = z;

}

if (ys > ye)

{

z = ys;

ys = ye;

ye = z;

}

w = (xe - xs);

z = (ye - ys);

if ((w < 2) && (z < 2)) startwerte();

else

{

if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);

else xe = (int)((float)xs + (float)z * xy);

x2 = x1 + xb* (double)xe;

y2 = y1 + yb * (double)ye;

x1 += xb * (double)xs;

y1 += yb * (double)ys;

}

xb = (x2 - x1) / (double)picX;

yb = (y2 - y1) / (double)picY;

julia();

rechteck = false;

repaint();

} else {

stopit = true;

}

}

public void mouseEntered(MouseEvent e)

{

}

public void mouseExited(MouseEvent e)

{

}

public void mouseClicked(MouseEvent e)

{

}

public void mouseDragged(MouseEvent e)

{

e.consume();

if (action)

{

xe = e.getX();

ye = e.getY();

rechteck = true;

repaint();

}

}

public void mouseMoved(MouseEvent e)

{

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值