// P1102.java:$B%8%'%M%l!<%?$K$h$k%U%i%/%?%k?^7A(B(2)

package applet;

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

public class P1102 extends xApplet
	implements ActionListener
{	JCheckBox[]cb=new JCheckBox[3];
	JComboBox cb0,cb1;
	String[]str0={"0.1","0.2","0.3","0.4",
		"0.5","0.6","0.7","0.8","0.9"};
	JButton[]bt=new JButton[3];
	String[]str1={"Start","Clear","Exit"};
	xGraphics G;
	int type,kx;
	double Leng=1.0;
	double a=0.8,b=0.4;

	public void init()
	{	app_init(7);
		Container cp=getContentPane();
		cp.setBackground(getBackground());
		cp.setLayout(new FlowLayout(FlowLayout.LEFT));
		JPanel pn=new JPanel();
		pn.setLayout(new GridLayout(3,1));
		ButtonGroup bg=new ButtonGroup();
		cb[0]=new JCheckBox("±ÝÓÅ²Ä$B6J@~7?(B");
		cb[1]=new JCheckBox("ÄÞ×ºÞÝ$B6J@~7?(B");
		cb[2]=new JCheckBox("$B%3%C%[6J@~7?(B");
		for(int i=0;i<3;i++)
		{	cb[i].setBackground(cp.getBackground());
			cb[i].addActionListener(this);
			bg.add(cb[i]);
			pn.add(cb[i]);
		}
		cp.add(pn);
		JLabel lb0=new JLabel("a=");
		lb0.setForeground(Color.black);
		cp.add(lb0);
		cb0=new JComboBox(str0);
		cb0.setEditable(false);
		cb0.addActionListener(this);
		cp.add(cb0);
		JLabel lb1=new JLabel("b=");
		lb1.setForeground(Color.black);
		cp.add(lb1);
		cb1=new JComboBox(str0);
		cb1.setEditable(false);
		cb1.addActionListener(this);
		cp.add(cb1);
		for(int i=0;i<str1.length;i++)
		{	bt[i]=new JButton(str1[i]);
			bt[i].addActionListener(this);
			cp.add(bt[i]);
		}
		G=new xGraphics(getGraphics());
	}

	public void actionPerformed(ActionEvent evt)
	{	if(evt.getSource()==cb[0])
		{	kx=320;type=0;
		}
		if(evt.getSource()==cb[1])
		{	kx=320;type=1;
		}
		if(evt.getSource()==cb[2])
		{	kx=600;type=2;
		}
		if(evt.getSource()==cb0)
		{	String s=(String)cb0.getSelectedItem();
			a=Double.valueOf(s).doubleValue();
		}
		if(evt.getSource()==cb1)
		{	String s=(String)cb1.getSelectedItem();
			b=Double.valueOf(s).doubleValue();
		}
		if(evt.getSource()==bt[0])
		{	if(a*a+b*b>=1.0||(1-a)*(1-a)+b*b>=1.0)
		 		G.textout(10,100,"error:Inadequate value of a,b",0,16);
		 	else
		 	{	G.set0(CA.x-kx/2,(int)(1.3*CA.y),1);
		 		paint2();
			}
		}
		if(evt.getSource()==bt[1])
			repaint();
		if(evt.getSource()==bt[2])
			System.exit(0);
	}

	private void paint2()
	{	G.putpixel(0,0,0);
		G.putpixel(kx,0,0);
		fractal(new xPointD(0.0,0.0),new xPointD((double)kx,0.0),0);
	}

	private void fractal(xPointD p0,xPointD p1,int n)
	{	xPointD dp=xMath.minus(p1,p0);
		if(xMath.abs(dp)>Leng)
		{	double x=p0.x+(a*dp.x-b*dp.y);
			double y=p0.y+(b*dp.x+a*dp.y);
			xPointD p=new xPointD(x,y);
			x=p0.x+(a*dp.x+b*dp.y);
			y=p0.y+(-b*dp.x+a*dp.y);
			xPointD p_=new xPointD(x,y);
			switch(type)
			{	case 0:
					G.putpixel(xMath.fint(p),0);
					fractal(p0,p,n+1);
					fractal(p,p1,n+1);
					break;
				case 1:
					G.putpixel(xMath.fint(p),0);
					fractal(p0,p,n+1);
					fractal(p1,p,n+1);
					break;
				case 2:
					if(n%2==0)
					{	G.putpixel(xMath.fint(p),0);
						fractal(p0,p,n+1);
						fractal(p,p1,n+1);
					}
					else
					{	G.putpixel(xMath.fint(p_),0);
						fractal(p0,p_,n+1);
						fractal(p_,p1,n+1);
					}
					break;
			}
		}
	}
}
