📄 tangramsolver.java
字号:
//Copyright (c) 1998, Arthur Gittleman
//This example is provided WITHOUT ANY WARRANTY either expressed or implied.
/* Start with the seven polygons forming
* a square. Drag them with the mouse, and rotate
* them with the F and B keys to form other shapes.
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class TangramSolver extends Applet
implements MouseMotionListener, KeyListener {
public static final double PCOS = Math.cos(Math.PI/60);
public static final double NCOS = Math.cos(-Math.PI/60);
public static final double PSIN = Math.sin(Math.PI/60);
public static final double NSIN = Math.sin(-Math.PI/60);
public static final double BIGPCOS = Math.cos(Math.PI/6);
public static final double BIGNCOS = Math.cos(-Math.PI/6);
public static final double BIGPSIN = Math.sin(Math.PI/6);
public static final double BIGNSIN = Math.sin(-Math.PI/6);
int [][] x = {{0,100,200},{100,200,200},{0,100,0},{0,50,0},
{50,150,100},{0,50,100,50},{100,200,150,50}};
int [][] y = {{200,100,200},{100,0,200},{0,0,100},{100,150,200},
{50,50,100},{100,50,100,150},{0,0,50,50}};
Color [] colors = {Color.red,Color.blue,Color.yellow,Color.magenta,
Color.cyan,Color.pink,Color.orange};
Polygon [] polygons = new Polygon[7];
int [] oldx = new int[7];
int [] oldy = new int[7];
int rotate;
int rotx;
int roty;
public void init() {
for (int i=0; i<x.length; i++) {
polygons[i] = new Polygon(x[i],y[i],x[i].length);
}
addMouseListener(new MousePressListener());
addMouseMotionListener(this);
addKeyListener(this);
requestFocus();
}
public void mouseMoved(MouseEvent event) { }
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
for (int i=0; i<7; i++){
if (polygons[i].contains(x,y)){
polygons[i].translate(x-oldx[i],y-oldy[i]);
oldx[i]=x;
oldy[i]=y;
repaint();
break;
}
}
}
class MousePressListener extends MouseAdapter {
public void mousePressed(MouseEvent event) {
int x = event.getX();
int y = event.getY();
for (int i=0; i<7; i++)
if (polygons[i].contains(x,y)){
oldx[i] = x;
oldy[i] = y;
break;
}
}
public void mouseReleased(MouseEvent event) {
int x = event.getX();
int y = event.getY();
for (int i=0; i<7; i++)
if (polygons[i].contains(x,y)){
rotate = i;
rotx = x;
roty = y;
break;
}
}
}
public void showPolygon
(Polygon p, Color c, Graphics g, boolean fill) {
Color oldColor = g.getColor();
g.setColor(c);
if (fill)
g.fillPolygon(p);
else
g.drawPolygon(p);
g.setColor(oldColor);
}
public void paint(Graphics g) {
for (int i=0; i<polygons.length; i++)
showPolygon(polygons[i],colors[i],g,true);
}
public void keyTyped(KeyEvent event) {
char key = event.getKeyChar();
double C;
double S;
switch(key) {
case 'b' : C = NCOS; S = NSIN; break;
case 'f' : C = PCOS; S = PSIN; break;
case 'B' : C = BIGNCOS; S = BIGNSIN; break;
case 'F' : C = BIGPCOS; S = BIGPSIN; break;
default : return;
}
polygons[rotate].translate(-rotx,-roty);
for (int j=0; j<polygons[rotate].npoints; j++) {
int x = polygons[rotate].xpoints[j];
int y = polygons[rotate].ypoints[j];
polygons[rotate].xpoints[j] = (int)Math.round(x*C - y*S);
polygons[rotate].ypoints[j] = (int)Math.round(x*S + y*C);
}
polygons[rotate].translate(rotx,roty);
repaint();
}
public void keyReleased(KeyEvent event) { }
public void keyPressed(KeyEvent event) { }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -