本次小实验,通过三个类的编写来实现。
首先创建一个点类,其中包含对点的构造方法和多个需要点的构造方法。
/*** 点类,表示平面中的点或始点为原点的向量* @author xxx**/
public class Point {public double x=0.0;  //x坐标或x分量public double y=0.0;  //y坐标或y分量/*** 构造方法* @param x x坐标或x分量* @param y y坐标或y分量*/public Point(double x, double y) {this.x=x;this.y=y;}/*** 计算两点之间的距离* @param p0 点p0* @param p1 点p1* @return p0、p1之间的距离*/public static double distance(Point p0, Point p1) {double d = Math.sqrt(Math.pow(p1.x - p0.x, 2) + Math.pow(p1.y - p0.y, 2));return d;}/*** 计算过p0、p1两点的直线与x轴的夹角* @param p0 点p0* @param p1 点p1* @return 过p0、p1两点的直线与x轴的夹角(弧度)*/public static double angle(Point p0, Point p1) {return Math.atan2(p1.y-p0.y, p1.x-p0.x);}/*** 坐标系原点平移到p0,计算p1在新坐标系中的坐标* @param p0 原点移动到的位置* @param p1 需计算坐标的点* @return p1在新坐标系中的坐标*/public static Point translation(Point p0, Point p1) {return new Point(p1.x-p0.x, p1.y-p0.y);}/*** 坐标系绕原点旋转theta角度,计算p点的新坐标* @param p 点p* @param theta 坐标系旋转的角度(弧度)* @return p点在新坐标系中的坐标*/public static Point rotate(Point p, double theta) {double x1=p.x*Math.cos(theta)+p.y*Math.sin(theta);double y1=p.y*Math.cos(theta)-p.x*Math.sin(theta);return new Point(x1, y1);}
}
其次,编写关于小球的类,其中包含小球的各个属性,以及边界碰撞检测,小球相互碰撞检测,碰撞后小球反弹等构造方法,以及绘制小球的类方法。

import java.awt.Color;
import java.awt.Graphics;/*** 小球类,以圆表示平面中移动的小球** @author xxx**/
public class Ball {Point c; // 圆心坐标double radius = 50; // 半径Point v; // 速度向量Color color ; // 颜色/*** 构造方法** @param cx    圆心x坐标* @param cy    圆心y坐标* @param vx    x方向速度分量* @param vy    y方向速度分量* @param color 小球颜色*/public Ball(double cx, double cy, double vx, double vy, Color color) {this.c = new Point(cx, cy);this.v = new Point(vx, vy);this.color = color;}/*** 移动小球*/public void move() {c.x += v.x;c.y += v.y;}/*** 边界检测,如超出或碰到边界,则修改小球的坐标及运动方向 左上角为坐标原点,需确保小球处于左上角坐标(0,0),宽width,高height的矩形内** @param width  矩形的宽* @param height 矩形的高*/public void checkBorder(double width, double height) {// 撞到左边if (c.x - radius <= 0) {c.x = radius;v.x = -v.x;}// 撞到右边if (c.x + radius >= width) {c.x = width - radius;v.x = -v.x;}// 撞到上边if (c.y - radius <= 0) {c.y = radius;v.y = -v.y;}// 撞到下边if (c.y + radius >= height) {c.y = height - radius;v.y = -v.y;}}/*** 检测两球是否碰撞** @param b1 小球1* @param b2 小球2* @return 相撞返回true,否则返回false*/public static boolean checkCollision(Ball b1, Ball b2) {//        //编写如何判断两个小球的距离是否为0,即可看是否碰撞。
//        if(Point.distance(b1.c,b2.c)>0){//            return false;
//        }
//        //若距离d<0,返回false,d>0,则返回true。
//        else {//        return true;}double r=b2.radius;if (Point.distance(b1.c,b2.c)<=2*r){return true;}else {return false;}}/*** 改变相撞的两球的速度向量** @param b1 小球1* @param b2 小球2*/public static void change(Ball b1, Ball b2) {// 计算两球中心连线的角度double theta = Point.angle(b1.c,b2.c);// 坐标系绕原点旋转theta角度,计算两球新的速度向量b1.v = Point.rotate(b1.v,theta);b2.v = Point.rotate(b2.v,theta);//Point.translation(b1.c,b2.c)// 交换两球沿中心连线方向的速度double vxt ;vxt = b1.v.x;b1.v.x = b2.v.x;b2.v.x = vxt;// 将坐标系旋转回来,计算两球在原坐标系中的速度向量//Point.translation(b1.c,b2.c)b1.v = Point.rotate(b1.v,-theta);b2.v = Point.rotate(b2.v,-theta);}/*** 绘制小球** @param g Graphics对象*/public void draw(Graphics g) {g.setColor(color); // 设置画笔颜色int x = (int) (c.x - radius); // 外接矩形左上角x座标int y = (int) (c.y - radius); // 外接矩形左上角y座标int width = (int) radius * 2; // 外接矩形的宽度int height = (int) radius * 2; // 外接矩形的高度g.fillOval(x, y, width, height); // 给出椭圆的左上角坐标及宽高,绘制填充椭圆}}
最后,建立测试的主函数方法,定义面板和主窗口,在窗口中绘图,利用计时器实现小球的动态变换即可。

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.Timer;
import java.util.TimerTask;@SuppressWarnings("serial")
class MainPanel extends JPanel { // 定义面板类Ball[] balls; // 小球数组public MainPanel() {balls = new Ball[5]; // 五个小球balls[0] = new Ball(10, 10, 2, 5, Color.YELLOW);balls[1] = new Ball(120, 100, 3, 2, Color.BLUE);balls[2] = new Ball(150, 50, 4, 1, Color.RED);balls[3] = new Ball(250, 0, 5, 3,Color.pink);balls[4] = new Ball(300, 200, 6, 4,Color.green);}@Overridepublic void paintComponent(Graphics g) { // 在paint方法中绘图super.paintComponent(g);// 边界和碰撞检测for (Ball b1 : balls) {b1.checkBorder(this.getWidth(), this.getHeight()); // 边界检测for (Ball b2 : balls) { // 碰撞检测if (b1 != b2 && Ball.checkCollision(b1, b2)) {Ball.change(b1, b2); // 改变两球的速度b1.move(); // 将两球移开一点距离b2.move();}}}// 移动并绘制小球for (Ball b : balls) {b.move(); // 移动小球b.draw(g); // 绘制小球}}
}@SuppressWarnings("serial")
class GameWindow extends JFrame { // 主窗口类MainPanel panel; // 面板Timer timer; // 计时器TimerTask task; // 任务public GameWindow() {super("测试窗口");panel = new MainPanel(); // 创建面板对象this.add(panel); // 将面板加到窗口中task = new TimerTask() { // 创建任务对象@Overridepublic void run() { // 执行任务要做的事情在此方法中编写panel.repaint(); // 重绘面板刷新}};timer = new Timer(); // 创建计时器timer.schedule(task, 0, 10); // 延迟0秒后每隔10毫秒执行一次任务setBounds(200, 100, 800, 600); // 设置窗口的位置及大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口的关闭操作setVisible(true); // 使窗口可见}}public class Test {public static void main(String[] args) {new GameWindow(); // 创建窗口对象,显示窗口}
}

【这是本人在校第一次写CSDN,之后还会分享很多在校期间学习到的小实验,仅供参考,若哪不对欢迎指正。最后强调,可免费使用代码,但编写不易,点个关注和小心心再走呗!】

java如何实现多个小球碰撞后反弹以及绘制动态图。相关推荐

  1. java png生成webp图片_PNG转WEBP格式的动态图

    最近接手的项目上需要替换以前的UI资源,其中有部分动态图使用的是freso+webp进行显示,然而设计给的只有一帧帧的PNG格式,本来想随便转个GIF弄上去,结果透明背景的PNG转成GIF很容易出现白 ...

  2. java 九大行星运行_html5 canvas太阳系九大行星运行动态图代码

    特效描述:html5 canvas 太阳系 九大行星运行 动态图代码.html5 canvas这个动画加上了每个行星的名称,只要鼠标移入目标行星就会显示. 代码结构 1. HTML代码 你浏览器不支持 ...

  3. 小球碰壁反弹加分_用Java实现小球碰壁反弹的简单实例(算法十分简单)

    用Java实现小球碰壁反弹的简单实例(算法十分简单) 核心代码如下: if(addX){ x+=3; }else{ x-=3; } if(addY){ y+=6; }else{ y-=6; } if( ...

  4. Java反弹球两球相撞_java实现小球碰撞反弹

    java实现小球碰撞反弹 java实现小球碰撞反弹 首先我们要在一个窗口里面显示这个功能,因此引入JFrame类然后创建一个窗口代码如下: JFrame win=new JFrame();//新建窗口 ...

  5. 使用java实现持续移动的小球

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5559829.html 仅为自己学习作品,使用java的JFrame框架实现持续移动的小球. ...

  6. js 小球碰壁反弹and小球碰撞

    好像好几天没有更博了呢,最近有点变懒了,这样不好,不好~~我们要做热爱学习的好孩子,嘻嘻,今天下午补上... 我们在学习js的时候,一个很经典的案例就是小球的碰壁反弹效果啦~简单的小球碰壁效果可以慢慢 ...

  7. java移动小球_使用java实现持续移动的小球

    复制代码 1 /*2 使用java实现持续移动的小球 3 */ 4 5 package jframe; 6 7 import java.awt.Color; 8 import java.awt.Gra ...

  8. 小球碰壁反弹加分_Javascript:Canvas的小球碰壁反弹

    (萌新),我今天在网上看了看如何在Canvas画布上做出小球碰壁反弹的效果,然后自己试做一下,感觉良好,不知道还有什么需要改良. 首先我的思路是: 1.在body创建一个canvas标签,设置宽:50 ...

  9. js运动小球碰壁反弹

    js运动小球碰壁反弹 1.触碰窗口壁沿反弹,同时改变颜色 <!DOCTYPE html> <html lang="en"><head><m ...

最新文章

  1. oracle测试环境表空间清理
  2. webpack2诸类事宜
  3. python 保留两位小数 实现方法
  4. SDWC2017游记
  5. HDU 2836 (离散化DP+区间优化)
  6. Linux Dynamic Shared Library LD Linker
  7. USACO3.22Stringsobits
  8. 输出斐波那契数列的第n项
  9. windows10 下使用Pycharm2016 基于Anaconda3 Python3.6 安装Mysql驱动总结
  10. matlab 求解线性规划问题
  11. Linux 内存管理之 SLUB分配器(6):slub debug 实例测试
  12. 【HMS core】【push kit】【FAQ】华为推送服务 手机未收到推送消息/消息延迟/息屏通知 问题合集
  13. Modelica学习笔记1
  14. 异地监控组网实战案例(速度快)
  15. eclipse vail_屏幕快照:Windows Home Server Beta“ Vail”安装过程
  16. 解决“the database principal owns a schema in the database and cannot be dropped“问题
  17. 【SQL】格式为yyyymmddhh:mm:ss的时间格式转换
  18. vue+vant 实现移动端问卷答题
  19. checkpoint = torch.load(args.state_dict) ->RuntimeError: CUDA error: out of memory
  20. SAP Down Payment的设置和使用分析

热门文章

  1. 系统集成部和行业应用部的职责
  2. UDP Socket
  3. VMWare安装虚拟机报错,VMware 启动虚拟机报错,您的主机不满足在启用 Hyper-V 或Device/Credential Guard 的情况下运行 VMware Workstatio
  4. QT 学习笔记(六)
  5. c55x 汇编语言指令,实验1 C55x汇编语言编程(2012328).doc
  6. 详解Android jit
  7. 基于对象分割的DEM 数据编辑
  8. 为什么剩余数不能相加_2018年公务员考试行测指导:数学运算之剩余问题
  9. ElasticJob分布式定时任务调度框架以及生产遇到的问题
  10. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java爱心慈善公益网站zjo04