我正在构建一个小型物理引擎,该引擎以给定的角度和速度发射弹丸,并在每个时间间隔跟踪并显示速度/位置矢量。目前,我的排名值vars.posNew似乎正在更新,但是我无法更新vars.xvars.y值。

这是我的代码:

#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() {

    float deltaT = 0.01;

    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);   // <-- I'm going wrong somewhere here
        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();
    }
}


我知道放在vars.xvars.y中的值是恒定值,这使我简单地认为我使用了错误的公式来计算这些值,或者我只是缺少一件事?

最佳答案

那么vars.x和vars.y是使用永远不变的vars.u计算的。尝试使用v(如果我理解正确,则使用新速度):

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


我认为您想使用v而不是u,因为v是新的速度。不确定vars.theta,它会随着时间变化吗?第一次计算vars.x和vars.y还是用新的速度完成,还是应该在第一次运行时用起始值完成,这也是正确的。也许考虑再添加一个变量,以便您可以较早运行一次来​​存储值。如果我纠结了很多,让我知道;)

关于c++ - 2D转换物-更新我的x和y值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41517131/

10-13 06:52