小球碰撞python代码 您所在的位置:网站首页 小球碰撞python代码 小球碰撞python代码

小球碰撞python代码

2024-06-02 13:10| 来源: 网络整理| 查看: 265

最后一次更新于2019/07/08

修复问题:

错误输入未提醒问题

碰撞小球的图形重叠问题

高速小球越界问题

感谢

大一暑假拜读学姐的一篇文章:我说这是一篇很严肃的技术文章你信吗,本篇在她的基础上加以改进。

效果演示图

bVbuKYq

基本思路

要实现小球运动,可以从以下几点切入:

1. 小球都有那些具体特征?

涉及动能定理就需要考虑质量了,除此之外常规的几个变量也不能忘:方向、球的尺寸,所在位置以及当前速度。

2. 谁能初始小球的状态?

小球的状态无非两种:(随机)默认值、人工手动输入。

3. 谁能控制小球的运动?

我们控制小球是需要给予一定的指令的,就算是鼠标点击也是简单的指令之一,除此之外如果想要拥有稍微复杂一点的指令可以使用按钮来实现。

根据分析,我们大概能构造出大概的类,无非是一个专门描述小球状态的,一个控制所有命令的,一个构建出窗口和选项的。我们还可以在细化这三个类的功能:

球类

因为窗口也是二维的,构造方法仅需要包含:质量,沿x、y轴的分速度,二维坐标表示的位置,颜色,大小, 所在的画板。

小球的外在属性:颜色,尺寸。

小球的移动情况:

遇到边界直接反弹

移动距离利用公式:距离 = 当前距离 + 速度 × 时间(这边直接简化成1)

小球之间的完全弹性碰撞公式:

$$\frac{ { {\rm{(}}{ {\rm{m}}_1} - {m_2}){v_{10}} + 2{m_2}{v_{20}}}}{ { { {\rm{m}}_1} + {m_2}}}$$

$$\frac{ { {\rm{(}}{ {\rm{m}}_2} - {m_1}){v_{20}} + 2{m_1}{v_{10}}}}{ { { {\rm{m}}_1} + {m_2}}}$$

碰撞的两球形状尽量不要重叠,当程序检测到这种意外时要尽可能拉开两球之间的距离,直到两球距离恰好等于两球半径之和。

代码如下:

/**

* 这个类主要是用来设置小球的各种属性以及运动关系。

* @author Hephaest

* @version 2019/7/5

* @since jdk_1.8.202

*/

import java.awt.Color;

import java.awt.Graphics;

import java.util.ArrayList;

public class Ball{

/**

* 声明小球的各种变量。

*/

private int xPos, yPos, size, xSpeed, ySpeed,mass;

private Color color;

private BallFrame bf;

/**

* 球类的构造函数。

* @param xPos 小球在X轴上的位置。

* @param yPos 小球在Y轴上的位置。

* @param size 小球的直径长度。

* @param xSpeed 小球在X轴上的分速度。

* @param ySpeed 小球在Y轴上的分速度。

* @param color 小球的颜色。

* @param mass 小球的质量。

* @param bf 当前小球所在的画板。

*/

public Ball(int xPos, int yPos, int size, int xSpeed, int ySpeed, Color color, int mass, BallFrame bf) {

super();

this.xPos = xPos;

this.yPos = yPos;

this.size = size;

this.xSpeed = xSpeed;

this.ySpeed = ySpeed;

this.color = color;

this.mass = mass;

this.bf = bf;

}

/**

* 在画板上绘制小球。

* @param g 当前小球。

*/

public void drawBall(Graphics g) {

if(xPos + size> bf.getWidth() - 4) xPos = bf.getWidth() - size - 4;

else if(xPos < 4) xPos = 4;

if(yPos < 4) yPos = 4;

else if(yPos > bf.getHeight()) yPos = bf.getHeight() - size - 4;

g.setColor(color);

g.fillOval(xPos, yPos, size, size);

}

/**

* 该方法是用来判断下一秒小球的移动方向并计算当前小球的位置。

* @param bf 当前小球所在的画板。

*/

public void moveBall(BallFrame bf) {

if (xPos + size + xSpeed > bf.getWidth() - 4 || xPos + xSpeed < 4)

{

xSpeed = -xSpeed;

}

if (yPos + ySpeed < 2 || yPos + size + ySpeed > bf.getHeight() - 163)

{

ySpeed = - ySpeed;

}

xPos += xSpeed;

yPos +&#



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有