数值计算,在每个阶段开始,都会记录下开始的时间,同时还会记录在这个阶段小球的初始X、Y坐标,初始X、Y方向上的速度等物理量。之后在这个阶段的运动中,小球的各项实时数据都根据这些记录的物理量以及当前时间计算得出。
为零判断,在小球上升的运动中和小球撞击地面后,都需要判断小球的速度是否为零。但是不同于真实的世界,在程序中小球的各项物理量都是离散的(即每隔固定的时间计算出这些物理量的值),小球实际的运动轨迹为一个个离散点。这种情况下如果还采用判断是否为零的方式就有可能出现错误(如在前一次的计算中小球速度为正,下一次的计算为负,跳过了速度为零这个转折点,小球将永远不可能出现为零这个时刻)。所以在程序中使用了阈值的方式,小球的速度一旦小于某个阈值,就将其认定为零。
BallThread类:
- package com.ball; public class BallThread extends Thread {
- Movable father; // Movable对象引用 boolean flag = false; // 线程执行标识位
- int sleepSpan = 40; // 休眠时间 float g = 200; // 球下落的加速度
- double current; // 记录当前时间 public BallThread(Movable father) {
- this.father = father; this.flag = true;
- } @Override
- public void run() { while (flag) {
- current = System.nanoTime(); // 获取当前时间,单位为纳秒,处理水平方向上的运动 double timeSpanX = (double) ((current - father.timeX) / 1000 / 1000 / 1000); // 获取水平方向走过的时间
- father.x = (int) (father.startX + father.v_x * timeSpanX); if (father.bFall) { // 处理竖直方向上的运动,判断球是否已经移出挡板
- double timeSpanY = (double) ((current - father.timeY) / 1000 / 1000 / 1000); father.y = (int) (father.startY + father.startVY * timeSpanY + timeSpanY
- * timeSpanY * g / 2); father.v_y = (float) (father.startVY + g * timeSpanY);










