2 C ++의 회 전체

실비 우

xy 평면에서 다른 하나 (body1)를 중심으로 바디 (body2)의 회전을 시뮬레이션하고 body2의 x 및 y 위치를 파일에 저장하는 C ++ 코드가 있습니다.

#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에 영향을 미치는 힘도 고려해야하지만 그렇다고 너무 작다고 말할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C의 AVL 회전

분류에서Dev

축의 회전

분류에서Dev

C # 2D 게임, 타원의 한 점에서 접선 각도로 회전

분류에서Dev

쿼드의 2D 회전

분류에서Dev

box2d의 회전 관절

분류에서Dev

iOS의 openGL 2에서 모델 회전

분류에서Dev

원 형성 내에서 생성되는 객체의 시프트 회전-Unity C #

분류에서Dev

C ++, 정적 개체 생성자의 예외는 이전 정적 개체의 소멸자를 우회합니다.

분류에서Dev

2D 배열 교체 및 회전

분류에서Dev

2D 개체 회전 기능?

분류에서Dev

Python에 의해 2-D에서 회전하는 객체의 초기 임의 위치 500 개 정의

분류에서Dev

자체 회전을 수행하는 동안 객체 주위의 OpenGL 회전

분류에서Dev

전체 화면 모드의 전화기 화면 회전 버튼

분류에서Dev

uiscreen SWIFT의 회전

분류에서Dev

회전 행렬을 사용하여 개체의 OpenCV 애니메이션 회전

분류에서Dev

두 개의 직사각형을 전체적으로 회전

분류에서Dev

C에서 2D 배열의 전체 열 초기화

분류에서Dev

Graphics2D의 회전 점프 스윙 자바

분류에서Dev

행을 열로 전치하는 2 개의 값으로 조회

분류에서Dev

중앙의 Cycle2 회전식 활성 슬라이드

분류에서Dev

Box2d : 회전 관절의 시작 각도

분류에서Dev

2 개의 모터를 동시에 회전 시키려고

분류에서Dev

2 개의 버튼이있는 jQuery로 이미지 회전

분류에서Dev

C ++에서 행렬 (2D 배열)을 45도 회전

분류에서Dev

C에서 비트의 오른쪽 회전

분류에서Dev

목표 c에서 앱 확장의 화면 회전 변경

분류에서Dev

C의 모음 주위로 단어 회전

분류에서Dev

LWJGL 회전 객체

분류에서Dev

C #의 사전 개체