用C++写两个小球碰撞
时间: 2023-09-26 18:13:51 浏览: 82
好的,下面是一个简单的用 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`,分别用于判断两个小球是否碰撞,并进行碰撞处理。在主函数中,我们创建了两个小球,并模拟它们的运动过程,输出每一步后两个小球的位置信息。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)