// P0702.java:$B%I!<%`(B

package applet;

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

public class P0702 extends xApplet
	implements ItemListener,ActionListener
{	Choice ch;
	Button bt;
	xGraphics3 G3;
	int rad=300,N;
	double rtx=22.5,rty=5.0,vpz=2000.0;
	xPoint3D Lt=new xPoint3D(1.0,1.0,2.0);

	public void init()
	{	app_init(2);
		setLayout(new FlowLayout(FlowLayout.LEFT));
		add(new Label("$BJ,3d?t!'(BN="));
		ch=new Choice();
		for(int i=1;i<10;i++)
			ch.add(Integer.toString(i));
		ch.addItemListener(this);
		add(ch);
		bt=new Button("$B>C5n(B");
		bt.addActionListener(this);
		add(bt);
		G3=new xGraphics3(getGraphics());
		G3.set0(CA.x,(int)(1.25*CA.y),1);
		G3.setpers(rtx,rty,vpz);
		G3.setshdspectra(4,6);
	}

	public void itemStateChanged(ItemEvent evt)
	{	if(evt.getSource()==ch)
		{	N=Integer.parseInt(ch.getSelectedItem());
			paint2();
		}
	}

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

	private void paint2()
	{	xPoint3D[][]vt=new xPoint3D[N+1][4*N];
		xPoint3D[][]ps=new xPoint3D[N+1][4*N];
		xPoint3D np,nv;
		int[]px=new int[4];
		int[]py=new int[4];
		vt[0][0]=new xPoint3D(0.0,(double)rad,0.0);
		ps[0][0]=G3.getpers(vt[0][0]);
		xPoint3D lt=xMath.ev(Lt);
		for(int i=1;i<=N;i++)
		{	double th=Math.PI*i/(2*N);
			double y=rad*Math.cos(th);
			for(int j=0;j<4*N;j++)
			{	double fi=Math.PI*j/(2*N);
				double x=rad*Math.sin(th)*Math.sin(fi);
				double z=rad*Math.sin(th)*Math.cos(fi);
				vt[i][j]=new xPoint3D(x,y,z);
				ps[i][j]=G3.getpers(vt[i][j]);
			}
		}
		for(int j=0;j<4*N;j++)
		{	np=xMath.nop(ps[0][0],ps[1][j],ps[1][(j+1)%(4*N)]);
			if(np.z>0)
			{	nv=xMath.nop(vt[0][0],vt[1][j],vt[1][(j+1)%(4*N)]);
				int its=(int)(240*xMath.ip(lt,nv));
				int col=G3.getspectrum(its);
				px[0]=xMath.fint(ps[0][0].x);
				py[0]=xMath.fint(ps[0][0].y);
				px[1]=xMath.fint(ps[1][j].x);
				py[1]=xMath.fint(ps[1][j].y);
				px[2]=xMath.fint(ps[1][(j+1)%(4*N)].x);
				py[2]=xMath.fint(ps[1][(j+1)%(4*N)].y);
				G3.fpolygon(px,py,3,col);
			}
		}
		for(int i=1;i<N;i++)
		{	for(int j=0;j<4*N;j++)
			{	np=xMath.nop(ps[i][j],ps[i+1][j],ps[i+1][(j+1)%(4*N)]);
				if(np.z>0)
				{	nv=xMath.nop(vt[i][j],vt[i+1][j],
						vt[i+1][(j+1)%(4*N)]);
					int its=(int)(240*xMath.ip(lt,nv));
					int col=G3.getspectrum(its);
					px[0]=xMath.fint(ps[i][j].x);
					py[0]=xMath.fint(ps[i][j].y);
					px[1]=xMath.fint(ps[i+1][j].x);
					py[1]=xMath.fint(ps[i+1][j].y);
					px[2]=xMath.fint(ps[i+1][(j+1)%(4*N)].x);
					py[2]=xMath.fint(ps[i+1][(j+1)%(4*N)].y);
					px[3]=xMath.fint(ps[i][(j+1)%(4*N)].x);
					py[3]=xMath.fint(ps[i][(j+1)%(4*N)].y);
					G3.fpolygon(px,py,4,col);
				}
			}
		}
	}
}
