我正在构建一个小型物理引擎,它发射一个具有给定角度和速度的射弹,并在每个时间间隔跟踪并显示速度/位置矢量,但我的程序存在一些问题。
当我运行我的程序时,它不会循环,并且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();
}
}
答案 0 :(得分:3)
将int deltaT = 0.01;
更改为float deltaT = 0.01f;
或double deltaT = 0.01;
。发生了什么事情,当你的“.01”被转换为整数时被切断。您需要float
或double
,因为它们会告诉编译器期望非整数值。现在,你告诉它期望一个整数值,因为它没有得到一个整数,它会删除小数点以外的所有内容以强制它为整数。
答案 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;
执行与该职位相同的工作:vars.v = vars.u + deltaT * a; vars.u = vars.v;
您对vars.x
和vars.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;
}