// P0802.java:$B6JLL(B($B1"1FI=<((B)

package applet;

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

public class P0802 extends xApplet
	implements ActionListener
{	JButton[]bt=new JButton[3];
	String[]str={"Start","Clear","Exit"};
	xGraphics3 G3;
	int k=100;
	double d=3.2,step=d/1000;
	double rtx=20.0,rty=30.0;
	xPoint3D Lt=new xPoint3D(1.0,1.0,1.0);

	public void init()
	{	app_init(7);
		Container cp=getContentPane();
		cp.setBackground(getBackground());
		cp.setLayout(new FlowLayout(FlowLayout.LEFT));
		JLabel lb=new JLabel
			("f(x,z)={1+2*(x*x-z*z)}/{1+(x*x+z*z)^2}");
		lb.setForeground(Color.black);
		cp.add(lb);
		for(int i=0;i<str.length;i++)
		{	bt[i]=new JButton(str[i]);
			bt[i].addActionListener(this);
			cp.add(bt[i]);
		}
		G3=new xGraphics3(getGraphics());
		G3.set0(CA.x,(int)(1.2*CA.y),1);
		int i=(int)(Math.floor((rtx+90.0)/180.0));
		rtx=rtx-i*180.0;
		i=(int)(Math.floor((rty+90.0)/180.0));
		rty=rty-i*180.0;
		G3.setproj(rtx,rty);
		G3.setshdspectra(0,7);
	}

	public void actionPerformed(ActionEvent evt)
	{	if(evt.getSource()==bt[0])
			paint2();
		if(evt.getSource()==bt[1])
			repaint();
		if(evt.getSource()==bt[2])
			System.exit(0);
	}

	private void paint2()
	{	xTimer t=new xTimer();
		t.settimer();
		double x,z;
		double step_x=step/G3.getproj(new xPoint3D(1.0,0.0,0.0)).x;
		double step_z=step/G3.getproj(new xPoint3D(0.0,0.0,1.0)).z;
		xPoint3D lt=xMath.ev(Lt);
		for(z=-d;z<=d+step_z/2;z=z+step_z)
		{	for(x=-d;x<=d+step_x/2;x=x+step_x)
			{	double y=func(x,z);
				xPoint3D nv=xMath.ev(getnv(x,z));
				if(G3.getproj(nv).z>-0.1)
				{	int its=(int)(240*xMath.ip(lt,nv));
					xPoint3D p=G3.getproj(k*x,k*y,k*z);
					G3.putpixel(xMath.fint(p.x),xMath.fint(p.y),
						G3.getspectrum(its));
				}
			}
		}
		t.gettimer();
		G3.textout(10,60,"Time="+t.Time,240,16);
	}

	private double func(double x,double z)
	{	double s0=x*x+z*z,s1=x*x-z*z;
		return (1+2*s1)/(1+s0*s0);
	}

	private xPoint3D getnv(double x,double z)
	{	double s0=x*x+z*z,s1=x*x-z*z;
		double d0=1+s0*s0,d1=1+2*s1;
		double dyx=4*x*(d0-s0*d1)/(d0*d0);
		double dyz=-4*z*(d0+s0*d1)/(d0*d0);
		double s=Math.sqrt(dyx*dyx+1+dyz*dyz);
		return new xPoint3D(-dyx/s,1.0/s,-dyz/s);
	}
}
