import java.awt.*;
import java.applet.*;
import java.lang.Math;
import java.awt.image.RGBImageFilter;
import java.awt.image.*;
import java.awt.Font;
import java.util.Random;
import java.lang.Integer;
import java.lang.NumberFormatException;
import java.net.MalformedURLException;
import java.awt.MediaTracker;
import java.lang.Thread;
import java.net.URL;
import java.awt.Point;


public class pyta extends Applet implements Runnable {
    Thread      animator;

    Dimension   offDimension;
	Image       offImage;
	Graphics    offGraphics;

	int         vertraging=50;
	int			stappen=1;
	int			fase=0;
	int			voorbijtijd=0;
	int			stoptijd=500;
	int			actieftijd=13000;

	Vierkant    vA, vB, vC;
	Driehoek    dA;
	double      deel=360/(Math.PI*2);
	double		konst=.1;

	boolean		stop=true;
	boolean		firsttime=true;
	boolean		weg=true;

	Color		achter;


	Random      rand;

    public String getAppletInfo() {
		return "pyta, (C) 1996 Floris Ouwendijk";
    }

	public String[][] getParameterInfo() {
		String[][] info = {
	    	{"vak", "hex", "kleur van vierkant a" },
	    	{"vbk", "hex", "kleur van vierkant b" },
	    	{"vck", "int", "kleur van vierkant c" },
	    	{"dk", "hex", "kleur van de driehoek" },
	    	{"achterkleur", "hex", "kleur van de achtergrond" }
	    };
		return info;
	}


    public void init() {
        int         t, kleurtje=0xFFFFFF00;
        String      hulpString;

        super.init();

		stappen=stoptijd/vertraging;

		hulpString=getParameter("vak");
	    try { t=Integer.parseInt(hulpString, 16); }
	    catch(NumberFormatException E) { t=0xFF0000; }
        vA=new Vierkant(40, 100,  80,  0, 4, t, 15);

        hulpString=getParameter("vbk");
	    try { t=Integer.parseInt(hulpString, 16); }
	    catch(NumberFormatException E) { t=0x00FF00; }
		vB=new Vierkant(30, 135, 115,  0, 3, t, 20);

        hulpString=getParameter("vck");
	    try { t=Integer.parseInt(hulpString, 16); }
	    catch(NumberFormatException E) { t=0x0000FF; }
		vC=new Vierkant(50, 156,  65, 53/deel, 5, t, 5);
		
		hulpString=getParameter("dk");
	    try { t=Integer.parseInt(hulpString, 16); }
	    catch(NumberFormatException E) { t=0xFFFF00; }
		dA=new Driehoek(-15, -20, 15, 20, -15, 20, 135, 80, 0, 10, t);

		hulpString=getParameter("achterkleur");
	    try { t=Integer.parseInt(hulpString, 16); }
	    catch(NumberFormatException E) { t=0xFFFFFF; }
		achter=new Color(t);

    }

    public void start() {
        animator = new Thread(this);
        animator.start();
    }

    public void run() {
	    long tm = System.currentTimeMillis();
	    while (Thread.currentThread() == animator) {
			if (fase==0) {
				if (firsttime) {
					voorbijtijd+=vertraging;
					if (voorbijtijd>=1000) {
						voorbijtijd=0; stop=true; 
						firsttime=false;
					}
				}
				else {
					voorbijtijd=0; stop=true;
					fase=1;						// actief
				}
												
			}
			if (fase==1) {
				if (voorbijtijd>=actieftijd) {
					if (stop==true) {
						fase=2;							// stop
						voorbijtijd=0;
						stappen=stoptijd/vertraging;
					}
				}
			}
			if (fase==2) {
				if (voorbijtijd>=stoptijd) {
					if (!weg) { showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it start"); }
					fase=3;
				}
			}
			if (stop==true) {
				voorbijtijd+=vertraging;
			}
	        repaint();
	        try {
                tm += vertraging;
	            Thread.sleep(Math.max(0, tm - System.currentTimeMillis()));
	        }
            catch (InterruptedException e) {
	            break;
			}
        }
	}

    public void stop() {
	    animator = null;
	    offImage = null;
	    offGraphics = null;
	}

	synchronized public void update(Graphics g) {
      	Dimension d = size();
        int         t, t2;
      	// Create the offscreen graphics context
       	if ((offGraphics == null) || (d.width != offDimension.width)
		        || (d.height != offDimension.height)) {
       		offDimension = d;
       		offImage = createImage(d.width, d.height);
       		offGraphics = offImage.getGraphics();
       	}
        paintFrame(offGraphics);
        g.drawImage(offImage, 0, 0, null);
    }

   	synchronized public void paint(Graphics g) {
        update(g);
    }

    synchronized public void paintFrame(Graphics g) {
		Dimension d = size();
		int         t, t2, hulp, afstand;
		double		hoek;
		int			dx, dy;
		double		krachtx=0.00000, krachty=0.00000;
		
		
		g.setColor(achter);
        g.fillRect(0,0, d.width, d.height);

		vC.teken(g);
		vA.teken(g);
		dA.teken(g);
		vB.teken(g);
		

		if (fase==1) {
			// bereken 'zwaartekracht' vA
			dx=vA.midden.x-dA.midden.x;
			dy=vA.midden.y-dA.midden.y;

			if (dx!=0) { krachtx=-10*dx/(vA.gewicht*dA.gewicht); }
			if (dy!=0) { krachty=-10*dy/(vA.gewicht*dA.gewicht); }
			
			vA.bereken(konst*krachtx, konst*krachty);

			// bereken 'zwaartekracht' vB
			dx=vB.midden.x-dA.midden.x;
			dy=vB.midden.y-dA.midden.y;

			if (dx!=0) { krachtx=-10*dx/(vB.gewicht*dA.gewicht); }
			if (dy!=0) { krachty=-10*dy/(vB.gewicht*dA.gewicht); }
			
			vB.bereken(konst*krachtx, konst*krachty);

			// bereken 'zwaartekracht' vC
			dx=vC.midden.x-dA.midden.x;
			dy=vC.midden.y-dA.midden.y;

			if (dx!=0) { krachtx=-10*dx/(vC.gewicht*dA.gewicht); }
			if (dy!=0) { krachty=-10*dy/(vC.gewicht*dA.gewicht); }
			
			vC.bereken(konst*krachtx, konst*krachty);

			// bereken aantrekking A en B
			dx=vA.midden.x-vB.midden.x;
			dy=vA.midden.y-vB.midden.y;

			if (dx!=0) { krachtx=(vA.gewicht*vB.gewicht)/dx; }
			if (dy!=0) { krachty=(vA.gewicht*vB.gewicht)/dy; }

			vA.bereken(konst*krachtx, konst*krachty);
			vB.bereken(-konst*krachtx, -konst*krachty);

			// bereken aantrekking C en B
			dx=vC.midden.x-vB.midden.x;
			dy=vC.midden.y-vB.midden.y;

			if (dx!=0) { krachtx=(vC.gewicht*vB.gewicht)/dx; }
			if (dy!=0) { krachty=(vC.gewicht*vB.gewicht)/dy; }

			vC.bereken(konst*krachtx, konst*krachty);
			vB.bereken(-konst*krachtx, -konst*krachty);

			// bereken aantrekking A en C
			dx=vA.midden.x-vC.midden.x;
			dy=vA.midden.y-vC.midden.y;

			if (dx!=0) { krachtx=(vA.gewicht*vC.gewicht)/dx; }
			if (dy!=0) { krachty=(vA.gewicht*vC.gewicht)/dy; }

			vA.bereken(konst*krachtx, konst*krachty);
			vC.bereken(-konst*krachtx, -konst*krachty);
			//bereken driehoek rotatie
			dA.rotatie= Math.asin((dA.midden.x-vA.midden.x)/Math.sqrt((dA.midden.x-vA.midden.x)*(dA.midden.x-vA.midden.x)+(dA.midden.y-vA.midden.y)*(dA.midden.y-vA.midden.y)));
			dA.rotatie+=Math.asin((dA.midden.x-vB.midden.x)/Math.sqrt((dA.midden.x-vB.midden.x)*(dA.midden.x-vB.midden.x)+(dA.midden.y-vB.midden.y)*(dA.midden.y-vB.midden.y)));
			dA.rotatie+=Math.asin((dA.midden.x-vC.midden.x)/Math.sqrt((dA.midden.x-vC.midden.x)*(dA.midden.x-vC.midden.x)+(dA.midden.y-vC.midden.y)*(dA.midden.y-vC.midden.y)));
		}
		if (fase==2) {
			vA.midden.x+=(100-vA.midden.x)/stappen;
			vA.midden.y+=(80-vA.midden.y)/stappen;
			vB.midden.x+=(135-vB.midden.x)/stappen;
			vB.midden.y+=(115-vB.midden.y)/stappen;
			vC.midden.x+=(156-vC.midden.x)/stappen;
			vC.midden.y+=(65-vC.midden.y)/stappen;

			vA.rotatie+=0-vA.rotatie/stappen;
			vB.rotatie+=0-vB.rotatie/stappen;
			vC.rotatie+=(53/deel-vC.rotatie)/stappen;
			dA.rotatie+=0-dA.rotatie/stappen;

			stappen--;
		}
		if (fase==3) {
			vA.midden.x=100;
			vA.midden.y=80;
			vB.midden.x=135;
			vB.midden.y=115;
			vC.midden.x=156;
			vC.midden.y=65;

			vA.rotatie=0;
			vB.rotatie=0;
			vC.rotatie=53/deel;
			dA.rotatie=0;
		}

	}

	public boolean mouseExit(Event  evt, int x, int y) {
		showStatus("");
		weg=true;
		return true;
	}


	public boolean mouseMove(Event e, int x, int y) {
		if (fase==1) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it continue");
		}
		if (fase==3) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it start");
		}
		if (stop==false) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it stop");
		}
		weg=false;
		return true;
	}

	public boolean mouseUp(Event e, int x, int y) {
		Dimension d = size();
		if (stop==false) { stop=true; fase=1; voorbijtijd=actieftijd; }
		else if (fase==3) { fase=0; }
		else if (fase==1) { stop=false; }

		if (fase==1) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it continue");
		}
		if (fase==3) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it start");
		}
		if (stop==false) {
			showStatus("pyta: (c) 1997, floris@dsv.nl  |  Click to make it stop");
		}

		
		return true; 
	}

}

class Vierkant {
    double      breedte;
    Point       midden;
    double      rotatie;
	int			gewicht;
	double		snelheidx=0, snelheidy=0;
    int         xpoints[];
	int			ypoints[];
	Color		kleur;
	int			speedlimit;



    Vierkant(int br, int xM, int yM, double r, int gw, int kleurtje, int sl) {
        breedte=Math.sqrt(br*br*2);
        midden=new Point(xM, yM);
        rotatie=r; 
		
		speedlimit=sl;
		kleur=new Color(kleurtje);
		gewicht=gw;
		xpoints=new int[4]; ypoints=new int[4];
    }
    void teken(Graphics g) {
		double      deel=360/(Math.PI*2);

        xpoints[0]=(int)(midden.x+breedte/2*Math.cos(rotatie+45/deel));
		ypoints[0]=(int)(midden.y+breedte/2*Math.sin(rotatie+45/deel));
		xpoints[1]=(int)(midden.x+breedte/2*Math.cos(rotatie+135/deel));
		ypoints[1]=(int)(midden.y+breedte/2*Math.sin(rotatie+135/deel));
		xpoints[2]=(int)(midden.x+breedte/2*Math.cos(rotatie+225/deel));
		ypoints[2]=(int)(midden.y+breedte/2*Math.sin(rotatie+225/deel));
		xpoints[3]=(int)(midden.x+breedte/2*Math.cos(rotatie+315/deel));
		ypoints[3]=(int)(midden.y+breedte/2*Math.sin(rotatie+315/deel));
		g.setColor(kleur);
		g.fillPolygon(xpoints, ypoints, 4);
	}
	void bereken(double kx, double ky) {
		snelheidx+=(kx); if (snelheidx>speedlimit) { snelheidx=speedlimit; }
		snelheidy+=(ky); if (snelheidy>speedlimit) { snelheidy=speedlimit; }
		midden.x+=(int)(snelheidx); midden.y+=(int)(snelheidy);
		rotatie=Math.asin(snelheidy/(Math.sqrt(snelheidy*snelheidy+snelheidx*snelheidx)));
	}
}

class Driehoek {
    Point       puntA, puntB, puntC, midden;
    double      rotatie;
	int			gewicht;
	Color		kleur;
	int			pointx[], pointy[];
	int			straala, straalb, straalc;
	double		bra, brb, brc;
	double      deel=360/(Math.PI*2);


    Driehoek(int xA, int yA, int xB, int yB, int xC, int yC,
                int xM, int yM, int r, int gw, int kleurtje) {
        puntA=new Point(xA, yA);
        puntB=new Point(xB, yB);
        puntC=new Point(xC, yC);
        midden=new Point(xM, yM);
        rotatie=r/deel; 
		gewicht=gw;
		kleur=new Color(kleurtje);
		pointx=new int[3]; pointy=new int[3];
		straala=(int)(Math.sqrt(xA*xA+yA*yA));
    	straalb=(int)(Math.sqrt(xB*xB+yB*yB));
		straalc=(int)(Math.sqrt(xC*xC+yC*yC));
		bra=Math.atan((double)((double)(yA)/(double)(xA)))+180/deel;
		brb=Math.atan((double)((double)(yB)/(double)(xB)));
		brc=Math.atan((double)((double)(yC)/(double)(xC)))+180/deel;
	}
	void teken(Graphics g) {
        int         ax, bx, cx;
		int         ay, by, cy;

        pointx[0]=(int)(midden.x+Math.cos(rotatie+bra)*straala);
		pointy[0]=(int)(midden.y+Math.sin(rotatie+bra)*straala);
		pointx[1]=(int)(midden.x+Math.cos(rotatie+brb)*straalb);
		pointy[1]=(int)(midden.y+Math.sin(rotatie+brb)*straalb);
		pointx[2]=(int)(midden.x+Math.cos(rotatie+brc)*straalc);
		pointy[2]=(int)(midden.y+Math.sin(rotatie+brc)*straalc);
		g.setColor(kleur);
		g.fillPolygon(pointx, pointy, 3);
	}

}

