⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tangramsolver.java

📁 Java 入门书的源码
💻 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 + -