两个小球碰撞速度计算方法

一 . 碰撞的特点和简化处理 :

①碰撞时间短,相互作用强,可不考虑外界的影响;

②碰撞前后状态变化突然且明显,可以认为:速度发生变化,但位置不发生变化。

二 . 对心碰撞 :

1. 对心碰撞 :碰撞前后的速度都沿两球的连心线,也叫 一维碰撞 。

2. 碰撞过程 :

① 压缩过程 :从两小球开始接触到两小球达到共同速度。( b )和( c )图,特点:

② 恢复过程 :从共同速度到分离的过程。( d )( e )图,特点: (恢复冲量)

消去

称: 为 接近速度 ,为 分离速度 。

3 . 牛顿碰撞公式 :

实验表明:对于材料一定的球,碰撞后分开的相对速度与碰撞前接近的相对速度成正比,比值称为 恢复系数 :

4 . 完全非弹性碰撞(

动量守恒:

(1)

机械能守恒:

(2)

(2)

所以:可以联上三式中任意二式,不妨:

时:

,且时:

,且时:

5 . 完全非弹性碰撞 :

动量守恒定律:

损失的动能:

6 . 非完全弹性碰撞 :

动量守恒定律:

三 . 非对心碰撞 :


定义 :如果两球相碰之前的速度不沿它们的中心连线,叫 非对心碰撞 ,也叫 斜碰 。

设二球的质量: 即:静止。设球表面光滑,相碰时 二球相互作用力沿二球接触时连心线方向,如图示与 x 轴的夹角为,则:

x 方向:

y 方向:对心碰撞:

若: ,即小球与光滑的无穷大的平面相碰,可知:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的用 C++ 编写的小球碰撞模拟程序,希望对您有所帮助。 ```c++ #include <iostream> #include <cmath> using namespace std; const double PI = 3.141592653589793; class Ball { public: Ball(double x, double y, double r, double vx, double vy, double m) : x_(x), y_(y), r_(r), vx_(vx), vy_(vy), m_(m) {} double GetX() const { return x_; } double GetY() const { return y_; } double GetRadius() const { return r_; } double GetVx() const { return vx_; } double GetVy() const { return vy_; } double GetMass() const { return m_; } void SetX(double x) { x_ = x; } void SetY(double y) { y_ = y; } void SetVx(double vx) { vx_ = vx; } void SetVy(double vy) { vy_ = vy; } void Move(double dt) { x_ += vx_ * dt; y_ += vy_ * dt; } friend bool IsCollided(const Ball& b1, const Ball& b2) { double dx = b1.x_ - b2.x_; double dy = b1.y_ - b2.y_; double d = sqrt(dx * dx + dy * dy); return d <= b1.r_ + b2.r_; } friend void Collide(Ball& b1, Ball& b2) { double dx = b1.x_ - b2.x_; double dy = b1.y_ - b2.y_; double d = sqrt(dx * dx + dy * dy); if (d < 1e-6) return; // 重叠了就不碰撞了 double nx = dx / d; double ny = dy / d; double tx = -ny; double ty = nx; double v1n = b1.vx_ * nx + b1.vy_ * ny; double v1t = b1.vx_ * tx + b1.vy_ * ty; double v2n = b2.vx_ * nx + b2.vy_ * ny; double v2t = b2.vx_ * tx + b2.vy_ * ty; double v1n_ = (v1n * (b1.m_ - b2.m_) + 2 * b2.m_ * v2n) / (b1.m_ + b2.m_); double v2n_ = (v2n * (b2.m_ - b1.m_) + 2 * b1.m_ * v1n) / (b1.m_ + b2.m_); b1.vx_ = v1n_ * nx + v1t * tx; b1.vy_ = v1n_ * ny + v1t * ty; b2.vx_ = v2n_ * nx + v2t * tx; b2.vy_ = v2n_ * ny + v2t * ty; } private: double x_; // x 坐标 double y_; // y 坐标 double r_; // 半径 double vx_; // x 方向速度 double vy_; // y 方向速度 double m_; // 质量 }; int main() { double x1 = 0, y1 = 0, r1 = 1, vx1 = 1, vy1 = 0, m1 = 1; double x2 = 3, y2 = 0, r2 = 1, vx2 = -1, vy2 = 0, m2 = 1; Ball b1(x1, y1, r1, vx1, vy1, m1); Ball b2(x2, y2, r2, vx2, vy2, m2); double dt = 0.01; int steps = 1000; for (int i = 0; i < steps; ++i) { if (IsCollided(b1, b2)) { Collide(b1, b2); } b1.Move(dt); b2.Move(dt); cout << "step " << i << ": (" << b1.GetX() << ", " << b1.GetY() << "), (" << b2.GetX() << ", " << b2.GetY() << ")" << endl; } return 0; } ``` 以上代码,我们定义了一个 `Ball` 类,表示一个小球,其包含了小球的位置、半径、速度和质量等信息。我们还定义了两个函数 `IsCollided` 和 `Collide`,分别用于判断两个小球是否碰撞,并进行碰撞处理。在主函数,我们创建了两个小球,并模拟它们的运动过程,输出每一步后两个小球的位置信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值