簡體   English   中英

2個C ++旋轉體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM