import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class shaga extends Applet
implements ActionListener, TextListener {
	TextField t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12;
	Label l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12;
	Button b;
	Dimension d;
	int xc;
	int yc;
	int p[][] = new int[13][3];
	int p_new[][] = new int[13][3];
	double a[][] = new double[3][3];
	double transx;
	double transy;
	double size;
	double rotate;
	double rl;
	double tb;

	public void init( ) {
		//アフィン変換入力テキスト
		t1 = new TextField("1",4);
		t2 = new TextField("0",4);
		t3 = new TextField("0",4);
		t4 = new TextField("0",4);
		t5 = new TextField("1",4);
		t6 = new TextField("0", 4);
		t7 = new TextField("0", 4);
		t8 = new TextField("0", 4);
		t9 = new TextField("1", 4);
		t10 = new TextField("0", 4);
		t11 = new TextField("1", 4);
		t12 = new TextField("1", 4);

		l1=new Label("a11");
		l2=new Label("a12");
		l3=new Label("a13");
		l4=new Label("a21");
		l5=new Label("a22");
		l6=new Label("a23");
		l7=new Label("x軸平行移動");
		l8=new Label("y軸平行移動");
		l9=new Label("拡大･縮小");
		l10=new Label("回転");
		l11=new Label("x軸拡大･縮小");
		l12=new Label("y軸拡大･縮小");
		add(l1); add(t1); add(l2); add(t2); add(l3); add(t3);
		add(l4); add(t4); add(l5); add(t5); add(l6); add(t6);
		add(l7); add(t7); add(l8); add(t8); add(l9); add(t9);
		add(l10); add(t10); add(l11); add(t11); add(l12); add(t12);

		b = new Button("変換");
		b.addActionListener(this);
		add(b);

		//シャガのデザイン画
		p[0][0] = 0;    p[0][1] = 0;	p[0][2] = 1;
		p[1][0] = -20;  p[1][1] = 20;   p[1][2] = 1;
		p[2][0] = -20;	p[2][1] = 60;	p[2][2] = 1;
		p[3][0] = 0;	p[3][1] = 50;	p[3][2] = 1;
		p[4][0] = 20;   p[4][1] = 60;	p[4][2] = 1;
		p[5][0] = 20;   p[5][1] = 20;	p[5][2] = 1;
		p[6][0] = 0; 	p[6][1] = 0; 	p[6][2] = 1;
		p[7][0] = -10; 	p[7][1] = 40; 	p[7][2] = 1;
		p[8][0] = 10; 	p[8][1] = 40; 	p[8][2] = 1;
		p[9][0] = 0; 	p[9][1] = 0; 	p[9][2] = 1;
		p[10][0] = -35; p[10][1] = 0; 	p[10][2] = 1;
		p[11][0] = 0; 	p[11][1] = -15; p[11][2] = 1;
		p[12][0] = 35; 	p[12][1] = 0; 	p[12][2] = 1;
	}

	//数値取得
	public void actionPerformed(ActionEvent ae){
		a[0][0] = Double.valueOf(t1.getText()).doubleValue();
		a[0][1] = Double.valueOf(t2.getText()).doubleValue();
		a[0][2] = Double.valueOf(t3.getText()).doubleValue();
		a[1][0] = Double.valueOf(t4.getText()).doubleValue();
		a[1][1] = Double.valueOf(t5.getText()).doubleValue();
		a[1][2] = Double.valueOf(t6.getText()).doubleValue();
		transx = Double.valueOf(t7.getText()).doubleValue();
		transy = Double.valueOf(t8.getText()).doubleValue();
		size = Double.valueOf(t9.getText()).doubleValue();
		rotate = Double.valueOf(t10.getText()).doubleValue();
		rl = Double.valueOf(t11.getText()).doubleValue();
		tb = Double.valueOf(t12.getText()).doubleValue();

		repaint( );
    }

	public void textValueChanged(TextEvent te) {
	}

	public void paint(Graphics g) {
		d = getSize( );
		xc = d.width /2;
		yc = d.height / 2;

		write_base(g);
		calc( );
		write_new(g);
	}

	//元の画像描画
	public void write_base(Graphics g) {
		g.setColor(Color.white);
		g.fillRect(0, 0, d.width, d.height);
		g.setColor(Color.red);
		g.drawLine(xc, 0, xc, d.height);
		g.drawLine(0, yc, d.width, yc);
		g.setColor(Color.black);
		for(int i=0; i<13; i++){
			g.drawLine(p[i][0] + xc, yc - p[i][1], p[(i+1)%13][0] + xc, yc - p[(i+1)%13][1]);
		}
	}

    //アフィン変換式の計算
	public void calc( ) {
		for(int i=0; i<13; i++) {
			for(int j=0; j<3; j++) {
				p_new[i][j] = 0;
			}
		}
		//式を理解するための数値計算
		for(int i=0; i<13; i++) {
			for(int j=0; j<3; j++) {
				for(int k=0; k<3; k++) {
					p_new[i][j] += (int ) (a[j][k]*p[i][k]);
				}
			}
		}
		//x軸平行移動
		for(int i=0; i<13; i++){
			p_new[i][0] = (int)(p_new[i][0] + transx);
		}
		//y軸平行移動
		for(int i=0; i<13; i++){
			p_new[i][1] = (int)(p_new[i][1] + transy);
		}
		//拡大･縮小
		for(int i=0; i<13; i++){
			for(int j=0; j<3; j++){
				p_new[i][j] = (int)(p_new[i][j] * size);
			}
		}
		//回転
		double sin = Math.sin(Math.PI/180 * rotate);
		double cos = Math.cos(Math.PI/180 * rotate);
		for(int i=0; i<13; i++){
			p_new[i][0] = (int)(p_new[i][0] * cos) - (int)(p_new[i][1] * sin);
			p_new[i][1] = (int)(p_new[i][0] * sin) + (int)(p_new[i][1] * cos);
		}
		//x軸拡大･縮小
		for(int i=0; i<13; i++){
			p_new[i][0] = (int)(p_new[i][0] * rl);
		}
		//y軸拡大･縮小
		for(int i=0; i<13; i++){
			p_new[i][1] = (int)(p_new[i][1] * tb);
		}
	}

	public void write_new(Graphics g) {
		g.setColor(Color.blue);
		for(int i=0; i<13; i++){
			g.drawLine(p_new[i][0] + xc, yc - p_new[i][1],
			p_new[(i+1)%13][0] + xc, yc - p_new[(i+1)%13][1]);
		}
	}

}
