[英]2 rotating body in C++
我在C ++中有這段代碼,假設它可以模擬一個物體(body2)在xy平面中圍繞另一個物體(body1)的旋轉,並將body2的x和y位置保存在一個文件中:
#include<iostream>
#include <vector>
#include<math.h>
#include <fstream>
using namespace std;
class Body{
private:
double G= 1;
double rx;
double ry;
double rz;
double vx;
double vy;
double vz;
double mass;
double fx;
double fy;
double fz;
double dt=0.01;
public:
Body(double rx, double ry, double rz, double vx, double vy, double vz, double mass){
this->rx=rx;
this->ry=ry;
this->rz=rz;
this->vx=vx;
this->vy=vy;
this->vz=vz;
this->mass=mass;
}
void update(){
vx=vx+dt*fx/mass;
vy=vy+dt*fy/mass;
vz=vz+dt*fz/mass;
rx=rx+vx*dt;
ry=ry+vy*dt;
rz=rz+vz*dt;
}
double get_x(){
return rx;
}
double get_y(){
return ry;
}
double get_z(){
return rz;
}
double get_fx(){
return fx;
}
void resetForce(){
fx=0.0;
fy=0.0;
fx=0.0;
}
void addForce(Body b){
double dx=b.rx-rx;
double dy=b.ry-ry;
double dz=b.rz-rz;
double dist = sqrt(dx*dx+dy*dy+dz*dz);
double F=G*mass*b.mass/dist*dist;
fx=fx+F*dx/dist;
fy=fy+F*dy/dist;
fz=fz+F*dz/dist;
}
};
int main(){
Body body1(0,0,0,0,0,0,1000), body2(100,0,0,0,10,0,10);
ofstream pos;
pos.open ("Position.txt");
int N=10000;
for(int i; i<N;i++){
body2.resetForce();
body2.addForce(body1);
body2.update();
pos<<body2.get_x()<<" "<<body2.get_y()<<endl;
}
pos.close();
}
我希望該圖看起來像原點周圍的圓(body1所在的位置),但是它看起來像這樣:
我認為在每個步驟上更新速度和力度的方式都有問題,但是我找不到錯誤,因此我非常感謝。
謝謝!
第一個錯誤是線上
double F=G*mass*b.mass/dist*dist;
這條線將像下面這樣解釋: double F=(G*mass*b.mass/dist)*dist;
因此,如您所見,我們的結果將不正確,您需要這一
double F=G*mass*b.mass/(dist*dist);
其次,您正在增加這條線中每個模擬步驟的力量
fx=fx+F*dx/dist;
fy=fy+F*dy/dist;
fz=fz+F*dz/dist;
但是我想你不應該這樣做,你需要這樣的改變
fx=F*dx/dist;
fy=F*dy/dist;
fz=F*dz/dist;
第三,我還假設您的身體在初始配置中實際上彼此遠離,您可以像這樣減少初始距離:
Body body1(0,0,0,0,0,0,1000), body2(10,0,0,0,10,0,10);
實際上,您還應該考慮body2對body1的影響力,但是可以,您可以說這太小了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.