// P0701.java:$B@5B?LLBN(B

package applet;

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

public class P0701 extends xApplet
	implements ItemListener,ActionListener
{	Checkbox cb0,cb1,cb2,cb3,cb4,cb5;
	Button bt;
	xGraphics3 G3;
	xRPh ph;
	int rad=300;
	double rtx=20.0,rty=15.0,vpz=2000.0;
	xPoint3D Lt=new xPoint3D(1.0,1.0,2.0);

	public Insets getInsets()
	{	return new Insets(0,0,0,AppSize.width-200);
	}

	public void init()
	{	app_init(4);
		add(new Label("$B@5B?LLBN$N<oN`!'(B"));
		Panel pn=new Panel();
		pn.setLayout(new GridLayout(3,2));
		CheckboxGroup cg=new CheckboxGroup();
		cb0=new Checkbox("$B@5(B4$BLLBN(B",cg,false);
		cb0.addItemListener(this);
		pn.add(cb0);
		cb1=new Checkbox("$BN)J}BN(B",cg,false);
		cb1.addItemListener(this);
		pn.add(cb1);
		cb2=new Checkbox("$BN)J}BN(B(2)",cg,false);
		cb2.addItemListener(this);
		pn.add(cb2);
		cb3=new Checkbox("$B@5(B8$BLLBN(B",cg,false);
		cb3.addItemListener(this);
		pn.add(cb3);
		cb4=new Checkbox("$B@5(B12$BLLBN(B",cg,false);
		cb4.addItemListener(this);
		pn.add(cb4);
		cb5=new Checkbox("$B@5(B20$BLLBN(B",cg,false);
		cb5.addItemListener(this);
		pn.add(cb5);
		add(pn);
		bt=new Button("$B>C5n(B");
		bt.addActionListener(this);
		add(bt);
		G3=new xGraphics3(getGraphics());
		G3.set0(CA,1);
		G3.setpers(rtx,rty,vpz);
		G3.setshdspectra(1,3);
	}

	public void itemStateChanged(ItemEvent evt)
	{	if(evt.getSource()==cb0)
			ph=new xRPh4((double)rad);
		if(evt.getSource()==cb1)
			ph=new xRPh6((double)rad);
		if(evt.getSource()==cb2)
			ph=new xRPh6_2((double)rad);
		if(evt.getSource()==cb3)
			ph=new xRPh8((double)rad);
		if(evt.getSource()==cb4)
			ph=new xRPh12((double)rad);
		if(evt.getSource()==cb5)
			ph=new xRPh20((double)rad);
		paint2();
	}

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

	private void paint2()
	{	xPoint3D[]ps=new xPoint3D[ph.NVt];
		xPoint3D nv,np;
		int[]n=new int[ph.Nvt];
		Point[][]pvt=new Point[ph.NFc][ph.Nvt];
		int[]col=new int[ph.NFc];
		int No=0,Face;
		xPoint3D lt=xMath.ev(Lt);
		for(int i=0;i<ph.NVt;i++)
			ps[i]=G3.getpers(ph.Vt[i]);
		for(int i=0;i<ph.NFc;i++)
		{	for(int j=0;j<ph.Nvt;j++)
				n[j]=ph.Ord[i][j];
			nv=xMath.nop(ph.Vt[n[0]],ph.Vt[n[1]],ph.Vt[n[2]]);
			np=xMath.nop(ps[n[0]],ps[n[1]],ps[n[2]]);
			if(np.z>0)
			{	int its=(int)(240*xMath.ip(lt,nv));
				col[No]=G3.getspectrum(its);
				for(int j=0;j<ph.Nvt;j++)
					pvt[No][j]=new Point(xMath.fint(ps[n[j]].x),
						xMath.fint(ps[n[j]].y));
				No++;
			}
		}
		Face=No;
		for(No=0;No<Face;No++)
			G3.fpolygon(pvt[No],ph.Nvt,col[No]);
	}
}
