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 ) ;
}
}
