2D射弹 - 速度和位置矢量

时间:2017-01-07 00:21:00

标签: c++ vector visual-studio-2015 physics

我正在构建一个小型物理引擎,它发射一个具有给定角度和速度的射弹,并在每个时间间隔跟踪并显示速度/位置矢量,但我的程序存在一些问题。

当我运行我的程序时,它不会循环,并且postion变量保持为0.我知道我在某处有数学错误,只是不知道在哪里。

这是我的计划:

#include <iostream>

using namespace std;

#define PI 3.14159265359

struct vecVariables {

    float v = 0, a = -9.81;
    float posNew = 0, posOld = 0;
    float x, y;
    float theta = 45;   // our start angle is 45
    float u = 20;       // our start velocity is 20
};

int main() {

    int deltaT = 0.01;
    int test;

    vecVariables vars;      // creates an object for Variables to be used

    while (deltaT <= 1) {

        deltaT += 0.01;

        vars.v = vars.u + vars.a * deltaT;  // gets the velocity V
        vars.posNew = vars.posOld + vars.v * deltaT;    // gets position D

        vars.x = vars.u * cos(vars.theta *  PI / 180);
        vars.y = vars.u * sin(vars.theta*  PI / 180);

        cout << "velocity vec = [" << vars.x << " , " << vars.y << "]" << endl;  // velocity on x, y

        cout << "pos = "<< vars.posNew << endl;  // display position

        vars.posOld = vars.posNew; 

        getchar();
    }
}

3 个答案:

答案 0 :(得分:3)

int deltaT = 0.01;更改为float deltaT = 0.01f;double deltaT = 0.01;。发生了什么事情,当你的“.01”被转换为整数时被切断。您需要floatdouble,因为它们会告诉编译器期望非整数值。现在,你告诉它期望一个整数值,因为它没有得到一个整数,它会删除小数点以外的所有内容以强制它为整数。

答案 1 :(得分:1)

您已将delta T声明为int,然后将其设置为0.01,将其转换为0.将delta T的声明更改为float。

答案 2 :(得分:0)

除了已引用的int deltaT内容之外,代码中还存在一些错误。 首先,如果不正确,你计算速度的方式。实际上,这里vars.u是常数,因此速度vars.v将始终相同。

vars.v = vars.u + vars.a * deltaT;  // gets the velocity V

你可以做两件事来解决这个问题:

  • 删除vars.u并仅使用vars.v(如果需要,可以将其初始化为20),这会将代码更改为vars.v += deltaT * a;

    < / LI>
  • 执行与该职位相同的工作:vars.v = vars.u + deltaT * a; vars.u = vars.v;

您对vars.xvars.y的计算仍然是错误的,theta也应该每帧都更新。

我不确定你为什么采取这个方向来解决你的问题,但我建议沿x和y轴解决所有问题,这看起来像这样(这应该编译,但我没有尝试它,可能有拼写错误)

#include <iostream>
#include <cmath>

using namespace std;

#define PI 3.14159265359

struct vecVariables {

    float startAngle = 45;
    float startVelocity = 20;

    float vx = 0;
    float vy = 0;

    float px = 0;
    float py = 0;

    float ax = 0;
    float ay = -9.81;
};

int main() {

    float deltaT = 0.01;
    vecVariables vars;      // creates an object for Variables to be used

    vars.vx = vars.startVelocity * cos(vars.startAngle * PI / 180);
    vars.vy = vars.startVelocity * sin(vars.startAngle * PI / 180);

    while (deltaT <= 1) {

        deltaT += 0.01;

        // Update velocity
        vars.vx += deltaT * vars.ax;
        vars.vy += deltaT * vars.ay;

        // Update position
        vars.px += deltaT * vars.vx;
        vars.py += deltaT * vars.vy;

        cout << "velocity vec = [" << vars.vx << " , " << vars.vy << "]" << endl;  // velocity
        cout << "position vec = [" << vars.px << " , " << vars.py << "]" << endl;  // position
        cout << endl;
    }

    return 0;
}
相关问题