import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
import java.util.Random;

public class Kaleidoscope extends JPanel{
    private Vector triangles;
    private final int SIZEX=500;
    private final int SIZEY=500;
    
    public Kaleidoscope() {
        triangles = new Vector();
        setPreferredSize(new Dimension(SIZEX,SIZEY));
        JFrame theFrame = new JFrame();
        theFrame.addWindowListener(
            new WindowAdapter(){ 
                public void windowClosing(WindowEvent event)
                    {System.exit(0);} 
                }
            );
        theFrame.setContentPane(this);
        theFrame.pack();
        theFrame.setVisible(true);
    }

    public void registerTriangle(Triangle t){
        triangles.addElement(t);
        repaint();
    }
    
    protected void paintComponent(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.fillRect(0,0,SIZEX,SIZEY);
        g.setColor(Color.CYAN);
        int vr[][]=new int[3][2];
        Random gen = new Random();
        
        double count = 0.0;
        for (Enumeration e = triangles.elements() ; e.hasMoreElements() ;) {
            count = count + 1.0;
            int cr = Math.abs(gen.nextInt()%256);
            int cg = Math.abs(gen.nextInt()%256);
            int cb = Math.abs(gen.nextInt()%256);
            g.setColor(new Color(cr,cg,cb));
            
            Triangle t = (Triangle)e.nextElement();       
            int[][] v=t.getData();
 
            for (double degree=0;degree<360;degree += 10){
                double s=Math.sin((degree+count)/180.0*Math.PI);
                double c=Math.cos((degree+count)/180.0*Math.PI);             
                    for (int p=0;p<3;p++){
                        vr[p][0]=(int)(Math.round(v[p][0]*c + v[p][1]*s)+SIZEX/2);
                        vr[p][1]=(int)(Math.round(v[p][0]*(-s) + v[p][1]*c)+SIZEY/2);
                    }
                
                    g.drawLine(vr[0][0],vr[0][1],vr[1][0],vr[1][1]);
                    g.drawLine(vr[1][0],vr[1][1],vr[2][0],vr[2][1]);
                    g.drawLine(vr[2][0],vr[2][1],vr[0][0],vr[0][1]);
            }  
        }
    }

    // ----------------------------------------- 
    public static void main(String args[]){
        Kaleidoscope kal = new Kaleidoscope();
        for (int i=5;i<=250;i+=20){
            new Triangle(kal,i);
        }
    }





}