// P0401.java:$BMc$N$h$&$J%+%*%9(B

import java.awt.*;
import java.awt.event.*;
import Glib.*;

public class P0401 extends xApplet
	implements ActionListener
{	Button bt;
	xGraphics G;
	int NL=1000000,k=42,dz=17,flag;
	double a=-0.9,b=0.96,c=-4.0,d=5.0,Div=1.0E10,z;
	xPointD p0=new xPointD(0.0,0.0);

	public void init()
	{	setLayout(new FlowLayout(FlowLayout.LEFT));
		bt=new Button("$BIA2h(B");
		bt.addActionListener(this);
		add(bt);
		app_init(7);
		G=new xGraphics(getGraphics());
		G.set0(CA,1);
		G.setcycspectra(2);
	}

	public void actionPerformed(ActionEvent evt)
	{	if(evt.getSource()==bt)
			paint2();
	}

	private void paint2()
	{	xTimer t=new xTimer();
		t.settimer();
		Point ps=new Point();
		xPointD p,pp;
		double s=c/(1-a+b);
		double ksx=Math.sqrt((2+a)/2);
		double ksy=Math.sqrt((2-a)/2);
		p=p0;
		for(int n=0;n<NL;n++)
		{	pp=recur(p);
			if(flag<0)
			{	G.textout(10,60,"$BH/;6(B!",240,16);
				return;
			}
			ps.x=xMath.fint(k*(pp.x+pp.y)/Math.sqrt(2.0)*ksx);
			ps.y=xMath.fint(k*(-pp.x+pp.y+2*s)/Math.sqrt(2.0)*ksy);
				G.putpixel(ps,(int)(dz*z)%240);
			p=pp;
		}
		t.gettimer();
		G.textout(10,60,"$BIA2h;~4V(B="+t.Time,240,16);
		G.textout(10,80,"a="+a,240,16);
		G.textout(10,100,"b="+b,240,16);
		G.textout(10,120,"c="+c,240,16);
		G.textout(10,140,"d="+d,240,16);
		G.textout(10,160,"p0=("+p0.x+","+p0.y+")",240,16);
	}

	private xPointD recur(xPointD p)
	{	z=xMath.abs(p);
		double x=a*p.x+b*p.y+c+d/(1+p.x*p.x);
		double y=-p.x;
		xPointD pp=new xPointD(x,y);
		double s=xMath.abs2(pp);
		if(s>Div)
			flag=-1;
		else
			flag=1;
		return pp;
	}
}
