import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.lang.Math; public class tangram extends Applet implements Runnable{ Thread th = null; Image os; Graphics og; int px[][] = {{20,136,20,20,20}, {360,360,244,360,360}, {278,360,360,278,278}, {319,360,360,319,319}, {61,20,20,61,61}, {171,253,212,130,171}, {20,78,78,20,20}}; int py[][] = {{264,380,380,264,264}, {264,380,380,264,264}, {40,40,122,40,40}, {191,150,232,191,191}, {191,150,232,191,191}, {40,40,81,81,40}, {40,40,98,98,40}}; int cx[] = {49,331,340,340,40,191,49}; int cy[] = {351,351,60,191,191,60,69}; int pdx[][] = {{108,272,272,108,108,108,108,108,108,108,108,108,108,108}, { 74,190,306,306,190, 74, 74, 74, 74, 74, 74, 74, 74, 74}, {132,248,248,190,190,248,248,190,190,248,248,132,132,132}, { 70,128,169,169,145,309,227,261,145, 87, 87,128,128, 70}, {103,277,277,195,219,161,161,185,267,103,103,103,103,103}, { 74,306,306,248,272,108,132, 74, 74, 74, 74, 74, 74, 74}, {190,248,272,313,190, 67,108,132,190,190,190,190,190,190}, {103,190,149,190,231,190,277,277,248,190,132,103,103,103}}; int pdy[][] = {{122,122,286,286,122,122,122,122,122,122,122,122,122,122}, { 94,210, 94,210,326,210, 74, 74, 74, 74, 74, 74, 74, 74}, { 65, 65,123,123,181,181,239,239,297,297,355,355, 65, 65}, {137, 79,120,202,226,226,308,342,342,284,202,161,137,137}, {123,123,287,205,181,181,235,211,293,293,123,123,123,123}, {140,140,198,256,280,280,256,198,140,140,140,140,140,140}, {102,160,160,201,324,201,160,160,102,102,102,102,102,102}, {164,164,123, 82,123,164,164,280,280,338,280,280,164,164}}; int sx[] = new int[5] , sy[] = new int[5]; int scx,scy,xx,yy; int pn = 7,dn = 0; int mx,my,dx,dy; double ir2 = 0.707107; Choice cho = new Choice(); public void init(){ setBackground(new Color(0,96,96)); os = createImage(380,400); og = os.getGraphics(); cho.addItem(" square "); cho.addItem(" V "); cho.addItem(" E "); cho.addItem(" swan "); cho.addItem(" arrow "); cho.addItem(" cup "); cho.addItem(" diamond "); cho.addItem(" man "); cho.addItemListener(new MyListener()); add(cho); addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e){ mx = e.getX(); my = e.getY(); if((cx[0]-mx)*(cx[0]-mx)+(cy[0]-my)*(cy[0]-my)<41*41){ pn = 0; }else if((cx[1]-mx)*(cx[1]-mx)+(cy[1]-my)*(cy[1]-my)<41*41){ pn = 1; }else if((cx[2]-mx)*(cx[2]-mx)+(cy[2]-my)*(cy[2]-my)<28*28){ pn = 2; }else if((cx[3]-mx)*(cx[3]-mx)+(cy[3]-my)*(cy[3]-my)<20*20){ pn = 3; }else if((cx[4]-mx)*(cx[4]-mx)+(cy[4]-my)*(cy[4]-my)<20*20){ pn = 4; }else if((cx[5]-mx)*(cx[5]-mx)+(cy[5]-my)*(cy[5]-my)<28*28){ pn = 5; }else if((cx[6]-mx)*(cx[6]-mx)+(cy[6]-my)*(cy[6]-my)<28*28){ pn = 6; }else{ pn = 7; } if(e.getClickCount() == 1){ if(pn != 7){ for(int di = 0;di < 5;di ++){ sx[di] = px[pn][di] ; sy[di] = py[pn][di] ; } scx = cx[pn] ; scy = cy[pn] ; } }else{ for(int rn = 0;rn < 5;rn ++){ xx = px[pn][rn] ; yy = py[pn][rn] ; px[pn][rn] = (int)(Math.round(ir2 * (xx - cx[pn] - yy + cy[pn]))) + cx[pn]; py[pn][rn] = (int)(Math.round(ir2 * (xx - cx[pn] + yy - cy[pn]))) + cy[pn]; } } repaint(); } } ); addMouseMotionListener( new MouseMotionAdapter(){ public void mouseDragged(MouseEvent e){ dx = e.getX(); dy = e.getY(); for(int nr = 0;nr < 5;nr ++){ px[pn][nr] = sx[nr] + dx - mx; py[pn][nr] = sy[nr] + dy - my; } cx[pn] = scx + dx - mx ; cy[pn] = scy + dy - my ; repaint(); } } ); } class MyListener implements ItemListener{ public void itemStateChanged(ItemEvent e){ Choice cho = (Choice)e.getSource(); switch(cho.getSelectedIndex()){ case 0 : dn = 0 ; break; case 1 : dn = 1 ; break; case 2 : dn = 2 ; break; case 3 : dn = 3 ; break; case 4 : dn = 4 ; break; case 5 : dn = 5 ; break; case 6 : dn = 6 ; break; case 7 : dn = 7 ; break; } repaint(); } } public void paint(Graphics g){ og.setColor(new Color(0,96,96)); og.fillRect(0,0,400,300); og.clipRect(10,30,360,360); og.setColor(Color.white); og.fillRect(10,30,360,360); og.setColor(Color.black); og.fillPolygon(pdx[dn],pdy[dn],14); for(int di = 0;di <7;di ++){ og.setColor(new Color(50,80,255)); og.fillPolygon(px[di],py[di],5); og.setColor(Color.blue); og.drawPolygon(px[di],py[di],5); } g.drawImage(os,0,0,this ); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void stop(){ th = null; } public void run(){ while (th != null){ try { Thread.sleep(30); } catch (InterruptedException e){ } } } public void update( Graphics g ){ paint( g ) ; } }