import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/*
<applet code = "afin.class"  width=400 height=400></applet>
*/
public class afin extends Applet implements ActionListener,TextListener{
    
    Graphics fg; //ダブルバッファリングのためのGraphicsクラス
    Image bg;
	
    TextField tbx; //入力のためのテキストフィールド
    TextField tby;
    TextField tsx;
    TextField tsy;
    TextField tk;
   
    int mx,my;
    int WIDTH = 400;	//アプレットの大きさ
   int HEIGHT = 200;
    
    Vect2 H[] = new Vect2[6];　//「H」の字を描く為の頂点群
    Vect2 A = new Vect2(0,0);
    
    
        

public void init(){
	/*パネルの設定*/
   	setLayout(new BorderLayout());

	Panel pps =  new Panel();//入れ子で一番上のパネル
	pps.setLayout(new BorderLayout());

	Panel pn = new Panel();//入れ子のパネル上
	pn.setLayout(new GridLayout(2,3));

	Label lb = new Label("拡大、縮小（Ｘ，Ｙ）");
	tbx = new TextField("1",5);
	tbx.addActionListener(this);
	
	tby = new TextField("1",5);
	tby.addActionListener(this);
	
	Label ls = new Label("せん断（Ｘ，Ｙ）");
	tsx = new TextField("0",5);
	tsx.addActionListener(this);
	
	tsy = new TextField("0",5);
	tsy.addActionListener(this);

	pn.add(lb);　//パネル（上）への貼りつけ
	pn.add(tbx);
	pn.add(tby);
	pn.add(ls);
	pn.add(tsx);
	pn.add(tsy);
	
	pps.add(pn,"North");

	Panel ps = new Panel();//入れ子のパネル下
	ps.setLayout(new GridLayout(2,2));
	
	Label lk = new Label("回転（０＜角度＜３６０）");
	tk = new TextField("0",5);
	tk.addActionListener(this);
	
	Button b1 = new Button("INPUT");
	b1.addActionListener(this);
	
	Button b2 = new Button("RESET");
	b2.addActionListener(this);
	ps.add(lk);
	ps.add(tk);
	ps.add(b1);　//パネル（下）への貼りつけ
	ps.add(b2);
	pps.add(ps , "South");

	add(pps , "South");
	
    for(int i=0;i < 6;i++){
		    H[i] = new Vect2();　//頂点群の初期化
		    }
	
	createH(H,A);    　//「H」の作成

	addMouseListener(new MouseAdapter(){　　//マウスが押されたときの処理
	    public void mousePressed(MouseEvent me){
		mx = me.getX();　//マウスが押されたところの座標をとる。
		my = me.getY();
		mx -= 200;　　　// アプレットの真ん中を原点にする
		my -= 100;
		
		copy(H,A);　　/*拡大、縮小による座標位置のずれをなくすために
				ある一点を原点にずらす。*/
		
		heikou(H,mx - A.x,my - A.y); //マウスの押された座標まで並行移動。
		rcopy(H,A);		//ある一点を原点からもとの位置にもどす。
		repaint();
	    }
	         
        });

	addMouseMotionListener(new MouseMotionAdapter(){　//マウスがドラッグされたときの処理
	   
	    public void mouseDragged(MouseEvent me){
		int now_x,now_y;	// マウスが押されたときと一緒
		    
		
		now_x = me.getX();
		now_y = me.getY();
		now_x = now_x - 200;
		now_y -= 100;
		
		copy(H,A);
		
		heikou(H,now_x - A.x,now_y - A.y);
		rcopy(H,A);
		repaint();
		}
        });

	bg = createImage(400, 200);　//ダブルバッファリング
	fg = bg.getGraphics();
    }
  
  
public void paint(Graphics g) {　//画像をかく
     
    fg.setColor(Color.white);
    fg.fillRect(0, 0, 400, 200);　//前に使っていた画面をクリア

    fg.setColor(Color.green);
    
    drawH(H,fg,400,200);　//Hの文字を書く

    g.drawImage(bg, 0, 0, this); 

  }

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

 public void createH(Vect2 V[],Vect2 A){　// Ｈの文字を書くために頂点を決める。
  	int p = 50;
 	 V[0].x=A.x;
 	 V[0].y=A.y + p;
 	 V[1].x=A.x;
 	V[1].y=V[0].y - p/2;
	 V[2].x=A.x + p;
	 V[2].y=A.y;
	 V[3].x=V[2].x;
	 V[3].y=V[0].y;
	 V[4].x=V[2].x;
 	V[4].y=V[0].y - p/2;
	 V[5].x = A.x;
 	V[5].y = A.y;
 }

 public void drawH(Vect2 V[],Graphics g,int width,int height){　// Ｈを描く
     int yoko = width / 2;
     int tate = height / 2;
     
	 g.drawLine(V[5].x + yoko,V[5].y + tate,V[0].x + yoko,V[0].y + tate);
	 g.drawLine(V[1].x + yoko,V[1].y + tate,V[4].x + yoko,V[4].y + tate);
	 g.drawLine(V[2].x + yoko,V[2].y + tate,V[3].x + yoko,V[3].y + tate);
 }
public void copy(Vect2 V[],Vect2 A)
    {
	for(int i=0;i<6;i++){
	    V[i].heikou(-A.x,-A.y);
	}
	
      }
public void rcopy(Vect2 V[],Vect2 A)　//点Ａを原点として平行移動。
    {
	for(int i=0;i<6;i++){
	    V[i].heikou(A.x,A.y);
	}
	A.x = V[5].x;
	A.y = V[5].y;
	
    }
public void heikou(Vect2 V[],int x ,int y)　//平行移動
    {

	for(int i=0;i<6;i++){
	    V[i].heikou(x,y);
	}
	
    }
public void bai(Vect2 V[],double x ,double y)　//拡大、縮小
    {
	for(int i=0;i<6;i++){
	    V[i].bai(x,y);
	}
    }

public void kaiten(Vect2 V[],int x) //回転
    {
	for(int i=0;i<6;i++){
	    V[i].kaiten(x);
	}
    }
public void sendan(Vect2 V[],int x ,int y) //せん断
    {
	for(int i=0;i<6;i++){
	    V[i].sendan(x,y);
	}
    }
public void actionPerformed(ActionEvent ae){　//入力の受けつけ
	double bx,by,sx,sy,k;
	
	if(ae.getActionCommand() == "INPUT"){
		bx = Double.valueOf(tbx.getText()).doubleValue();
		by = Double.valueOf(tby.getText()).doubleValue();
		sx = Double.valueOf(tsx.getText()).doubleValue();
		sy = Double.valueOf(tsy.getText()).doubleValue();
		k = Double.valueOf(tk.getText()).doubleValue();

		copy(H,A);
		bai(H,bx,by);              //アフィン変換中
		sendan(H,(int)sx,(int)sy);
		kaiten(H,(int)k);
		rcopy(H,A);
		repaint();

		
		}

	else if(ae.getActionCommand() == "RESET"){
		A.setvect();
		createH(H,A);
		repaint();
		tbx.setText("1");
		tby.setText("1");
		tsx.setText("0");
		tsy.setText("0");		
		tk.setText("0");
		
		}
	}

public void textValueChanged(TextEvent te){
	
	}	
}
