import java.applet.*; import java.awt.*; import java.lang.*; import java.applet.Applet; import java.awt.geom.*; public class kadai0407 extends java.applet.Applet{ double dots[][]; //図形座標格納用配列 int jiku[][]; //座標軸座標格納用配列 double pi = 3.14159; //円周率 int Point = 300; //座標最大数 Image scrBuf; Graphics grpBuf; int centerx, centery; //中心位置 Font f = new Font("TimesRoman",Font.BOLD,32); //フォントの指定 public void init(){ jiku = new int[4][2]; dots = new double[Point][2]; // 正方形の座標 dots[0][0]= 0.0; dots[0][1]= 50.0; dots[1][0]= 80.0; dots[1][1]= 80.0; dots[2][0]= 50.0; dots[2][1]= 0.0; dots[3][0]= 0.0; dots[3][1]= 0.0; // 座標軸 jiku[0][0] = 150; jiku[0][1] = 0; jiku[1][0] = -150; jiku[1][1] = 0; jiku[2][0] = 0; jiku[2][1] = 150; jiku[3][0] = 0; jiku[3][1] = -150; setPoint(); //座標セット scrBuf = createImage(size().width, size().height); grpBuf = scrBuf.getGraphics(); centerx = size().width*1/3; //中心設定 centery = size().height/2; setLayout(new BorderLayout()); //ボタンレイアウト Panel control = new Panel(); control.setLayout(new GridLayout(4,2)); control.add(new Button("平行移動 +x")); control.add(new Button("平行移動 +y")); control.add(new Button("平行移動 -x")); control.add(new Button("平行移動 -y")); control.add(new Button("原点回転 +")); control.add(new Button("原点回転 -")); control.add(new Button("拡大")); control.add(new Button("縮小")); add("East",control); } public void paint(Graphics g){ grpBuf.setColor(new Color( 255, 255, 255)); grpBuf.fillRect(0, 0, size().width, size().height); draw_jiku(); //座標軸描画 draw_dots(); //図形描画 g.drawImage(scrBuf, 0, 0, null); } public void update(Graphics g) { paint(g); } //座標軸描画設定 public void draw_jiku(){ grpBuf.setColor(new Color(0,0,0)); grpBuf.drawLine(centerx+jiku[0][0], centery+jiku[0][1],centerx+jiku[1][0], centery+jiku[1][1]); grpBuf.drawLine(centerx+jiku[2][0], centery+jiku[2][1],centerx+jiku[3][0], centery+jiku[3][1]); grpBuf.setFont(f); grpBuf.setColor(new Color(0,255,255)); grpBuf.drawString("X",centerx+jiku[0][0],centery+jiku[0][1]); grpBuf.drawString("Y",centerx+jiku[2][0],centery+jiku[2][1]); } //図形描画設定 public void draw_dots() { grpBuf.setColor(new Color(0,255,0)); grpBuf.drawLine(centerx+(int)dots[0][0], centery+(int)dots[0][1], centerx+(int)dots[1][0], centery+(int)dots[1][1]); grpBuf.drawLine(centerx+(int)dots[1][0], centery+(int)dots[1][1], centerx+(int)dots[2][0], centery+(int)dots[2][1]); grpBuf.drawLine(centerx+(int)dots[2][0], centery+(int)dots[2][1], centerx+(int)dots[3][0], centery+(int)dots[3][1]); grpBuf.drawLine(centerx+(int)dots[3][0], centery+(int)dots[3][1], centerx+(int)dots[0][0], centery+(int)dots[0][1]); } //座標セット public void setPoint(){ int i; for(i=0;i<4;i++){ jiku[i][1]= -1*jiku[i][1]; } for(i=0;i<4;i++){ dots[i][1]= -1*dots[i][1]; } } //ここからが各アフィン変換用の関数 void Tranx(int tx){ //平行移動 X int i=0; while(i<4){ dots[i][0]=dots[i][0]+tx; i++; } } void Trany(int ty){ //平行移動 Y int i=0; while(i<4){ dots[i][1]=dots[i][1]-ty; i++; } } void Rot(double r){ //原点回転移動 int i; double sr = Math.sin(r); double cr = Math.cos(r); for(i=0;i<4;i++){ double dx = dots[i][0]; double dy = dots[i][1]; dots[i][0]= dx*cr-dy*sr; dots[i][1]= dx*sr+dy*cr; } } void Xerox(double s){ //拡大縮小 int i; for(i=0;i<4;i++){ double dx = dots[i][0]; double dy = dots[i][1]; dots[i][0]= s*dx; dots[i][1]= s*dy; } } //ボタンを押すことにより各変換を行う public boolean action(Event e, Object o) { int j = 0; if(e.target instanceof Button){ if("平行移動 +x".equals(o)){ Tranx(4); repaint(); }else if("平行移動 -x".equals(o)){ Tranx(-4); repaint(); }else if("平行移動 +y".equals(o)){ Trany(4); repaint(); }else if("平行移動 -y".equals(o)){ Trany(-4); repaint(); }else if("原点回転 -".equals(o)){ Rot(pi/12); repaint(); }else if("原点回転 +".equals(o)){ Rot(-pi/12); repaint(); }else if("拡大".equals(o)){ Xerox(1.2); repaint(); }else if("縮小".equals(o)){ Xerox(0.5); repaint(); } return true; } return false; } }