由于Java可以很轻易的完成比较复杂的数学运算,所以我们经常能看到物理领域的问题借助Java实现效果演示,下面我给出一个桌球碰撞的处理及绘制实例。
package
org.test.mail;

import
java.awt.Color;
import
java.awt.Frame;
import
java.awt.Graphics;
import
java.awt.Image;
import
java.awt.Panel;
import
java.awt.event.MouseEvent;
import
java.awt.event.MouseListener;
import
java.awt.event.MouseMotionListener;
import
java.awt.event.WindowAdapter;
import
java.awt.event.WindowEvent;
import
java.awt.image.BufferedImage;


/** */
/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:Java桌球演示
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/

public
class
JavaBilliards
extends
Panel
implements
Runnable, MouseListener,

MouseMotionListener
...
{


/** *//**
*
*/
private static final long serialVersionUID = -5019885590391523441L;

// 球
private double _ball;

// 缓存用背景
private Image _screen;

// 画布
private Graphics _graphics;

// 台桌
private Image _table;

private double c[];

private double d[];

private double e[];

private double f[];

private int countBall;

private int h;

private double i[];

private double j[];

private double k[];

private double l[];

private double m[];

private double n[];

private double o[];

private double p[];

private boolean q[];

private double r;

private int a;

private int u;

private int v;

private int w;

private int x;

private boolean y;

private int z;

private int A;


/** *//**
* 初始化
*
*/

public JavaBilliards() ...{
a = 0;
r = 10D;
z = 300;
A = 0;
setBounds(50, 50, 700, 350);
Frame frame = new Frame("Java桌球演示");
frame.add(this);
frame.setBounds(0, 0, 700, 380);
frame.setResizable(false);
frame.setVisible(true);

frame.addWindowListener(new WindowAdapter() ...{

public void windowClosing(WindowEvent e) ...{
System.exit(0);
}
});
requestFocus();
initialize();
}


public void initialize() ...{
// 基础数据
base();
// 注入实例
immit();
// 缓存背景
_screen = new BufferedImage(this.getWidth(), this.getHeight(), 1);
// 背景图形
_graphics = _screen.getGraphics();
// 绘制台桌
makeTable();
// 设置监听
addMouseListener(this);
addMouseMotionListener(this);
// 启动
new Thread(this).start();
}


/** *//**
* 初始化数据
*
*/

public void base() ...{

// 球体
_ball = 16D;

c = (new double[] ...{ 40D, (double) (getWidth() - 40) });

d = (new double[] ...{ c[0], (double) getHeight() - c[0] });

e = (new double[] ...{ c[0] + 20D, (double) (getWidth() / 2), c[1] - 20D });

f = (new double[] ...{ d[0] + 20D, d[1] - 20D });
}


/** *//**
* 注入实例
*
*/

public void immit() ...{
countBall = 16;
i = new double[countBall];
j = new double[countBall];
k = new double[countBall];
l = new double[countBall];
m = new double[countBall];
n = new double[countBall];
o = new double[countBall];
p = new double[countBall];
q = new boolean[countBall];
// 打击对象
hitObject();
// 打击用球
hitBall();
}


/** *//**
* 打击用球数值
*
*/

public void hitBall() ...{
i[0] = (1.0D * (e[2] - e[0])) / 3D;
j[0] = this.getHeight() / 2;
k[0] = 0.0D;
l[0] = 0.0D;
q[0] = true;
}


/** *//**
* 打击对象
*
*/

public void hitObject() ...{
int il = 1;
h = countBall - 1;
// 求平方根
double dl = Math.sqrt(3.5D);

for (int j1 = 0; j1 < 5; j1++) ...{
double d2 = ((double) getWidth() * 2D) / 3D + (double) j1 * dl * r;
double d3 = (double) (getHeight() / 2) - (double) j1 * r;

for (int k1 = 0; k1 <= j1; k1++) ...{
i[il] = d2;
j[il] = d3;
k[il] = 0.0D;
l[il] = 0.0D;
q[il] = true;
d3 += 2D * r;
il++;
}

}

}

这么点代码居然不能一次都发了……
/** */
/**
* 绘制台球桌
*
*/

public
void
makeTable()
...
{
_table = new BufferedImage(this.getWidth(), this.getHeight(), 1);
Graphics g = _table.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor((new Color(200, 100, 50)).darker());
g.fill3DRect((int) c[0], (int) d[0], (int) (c[1] - c[0]),
(int) (d[1] - d[0]), true);
g.setColor(Color.BLACK);
g.fill3DRect((int) e[0], (int) f[0], (int) (e[2] - e[0]),
(int) (f[1] - f[0]), false);
g.setColor(Color.GREEN.darker());
g.drawLine((int) ((1.0D * (e[2] - e[0])) / 3D), (int) f[0],
(int) ((1.0D * (e[2] - e[0])) / 3D), (int) f[1]);
g.fillOval((int) ((1.0D * (e[2] - e[0])) / 3D) - 2,
(int) ((f[1] + f[0]) / 2D) - 2, 4, 4);
g.drawArc((int) ((1.0D * (e[2] - e[0])) / 3D) - 20,
(int) ((f[1] + f[0]) / 2D) - 20, 40, 40, 90, 180);
g.setColor(Color.BLACK);
double d1 = _ball - 2D;

for (int i1 = 0; i1 < 3; i1++) ...{















































































































































































































































这么点代码居然不能一次都发了……




























