Java模拟桌球打击处理及绘制

                由于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++) ...{
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值