2016-11-27 2 views
-1

Я строю маленький движок физики, который запускает снаряд по набору параметров запуска пользователем (угол, высота, временной интервал и начальная скорость), затем отображает некоторую информацию, такую ​​как общее расстояние или угол в каждом временном интервале, что он находится в воздухе:Снаряд не идет вниз на отрицательный угол

bool heightCheck = false; 
double theta; 
double initialVelocity, velocity; 
double yNew = 0.0, xNew, xOld = 0.0, yOld = 0.0; 
const double time = 0.1; 
const double gravitiyHalf = 9.8/2; 
double velocityX = 0.0, velocityY = 0.0; 
double angle = 0.0; 
double totalT = 0; 
double maxHeight = 0.0; 
double thetaDegrees = 0; 
#define PI 3.14159265l // constant for PI 

cout << "Insert a lanuch Angle (theta): "; 
cin >> thetaDegrees;  
cout << "Insert a launch height: ";  
cin >> yOld;    
cout << "Insert an initial velocity: ";  
cin >> initialVelocity;  
cout << "Time (DeltaT) in seconds: "; 
cin >> totalT; 

for (double deltaTime = 0.0; deltaTime < totalT; deltaTime += 0.1) { 

    const double squared = deltaTime * deltaTime;  // squared constant for deltaTime squared 

    theta = thetaDegrees * PI/180; // converts theta to a degrees value 

    velocityX = initialVelocity * cos(theta); // calculates Vx 
    velocityY = initialVelocity * sin(theta); // calculates Vy 

    // apply initialV to velocity 
    velocity = initialVelocity + 9.8 * time; 

    xNew = xOld + velocity * time; // works out displacement for X 

    yNew = yOld + velocity * deltaTime - gravitiyHalf/0.5 * (squared); // calculates Y 

    velocityY = velocity - 9.8 * deltaTime; // includes gravity to Y 

    angle = atan2(yNew, xNew) * 180/PI; // convert angle to degrees 

    cout << "\nHeight: " << yNew << endl; 
    cout << "Distance in Meters: " << xNew << "m" << endl; 
    cout << "Angle: " << angle << endl; 
    cout << "Time: " << deltaTime << "s " << endl; 

    if (heightCheck == false) { 
     maxHeight = yOld; 
     // keep maxheight equal to previous height 
    } 

    if (yNew < yOld && heightCheck == false) { 
     heightCheck = true; 
     // if projectile is going down, trigger maxheight 
    } 

    cout << "Maximum height: " << maxHeight << endl; 

    if ((yNew < 0) || (deltaTime == totalT)) { 
     getchar();  // stops if delta t = total T or projectile landed 
    } 

    yOld = yNew; // refresh x & y 
    xOld = xNew; 
} 

Если я введите следующие значения в начале моей программы:

theteDegrees = 45

yOld = 0

initialVelocity = 20

= Общее число 10

Моя программа отображает ожидаемые результаты, которые показывают мой снаряд идет вверх, то вниз. Однако, если я вхожу в те же самые значения, ожидаю, что -40 для thetaDegrees, мой снаряд должен возглавить прямо вниз, вместо этого он просто поднимается, а затем снова падает.

Где я ошибался в своем коде?

+2

'thetaDegrees' переходит в расчет' velocityX' и 'speedY' - ни один из них фактически не используется в дальнейшем. Вы эффективно кодируете угол съемки 45 градусов. –

+0

Используете ли вы отладчик, который поставляется с вашим набором инструментов компилятора? Такие вопросы, как ваш, могут быть легко решены, если вы используете ваш отладчик. Изучение того, как использовать отладчик, является обязательным в процессе обучения написанию программ. – PaulMcKenzie

+0

@IgorTandetnik Просто исправил это, я не понял, что случайно использовал «скорость» как для 'yNew', так и для xNew', должен был использовать' speedX' & 'speedY', спасибо за указание на это! –

ответ

0

Как сказал Игорь, при расчете расстояния по X и Y вы не учитывали скорость X и скорость Y.

xNew = xOld + velocity * time; // works out displacement for X 
    yNew = yOld + velocity * deltaTime - gravitiyHalf/0.5 * (squared); // calculates Y 

Приведено несколько избыточных расчетов. Более упрощенная версия может быть такой.

theta = thetaDegrees * PI/180; // converts theta to a degrees value 

velocityX = initialVelocity * cos(theta); // calculates Vx 
velocityY = initialVelocity * sin(theta); // calculates Vy 

//cout<<velocityX<<endl<<velocityY<<endl; 

for (double deltaTime = 0.0; deltaTime < totalT; deltaTime += 0.1) { 

const double squared = deltaTime * deltaTime;  // squared constant for deltaTime squared 

xNew = xOld + velocityX * time; // works out displacement for X 

yNew = yOld + velocityY * deltaTime - gravitiyHalf/0.5 * (squared); // calculates Y 

velocityY = velocityY - 9.8 * deltaTime; // includes gravity to Y 

angle = atan2(yNew, xNew) * 180/PI; // convert angle to degrees 

cout << "\nHeight: " << yNew << endl; 
cout << "Distance in Meters: " << xNew << "m" << endl; 
cout << "Angle: " << angle << endl; 
cout << "Time: " << deltaTime << "s " << endl; 

if (heightCheck == false) { 
    maxHeight = yOld; 
    // keep maxheight equal to previous height 
} 

if (yNew < yOld && heightCheck == false) { 
    heightCheck = true; 
    // if projectile is going down, trigger maxheight 
} 

cout << "Maximum height: " << maxHeight << endl; 

if ((yNew < 0) || (deltaTime == totalT)) { 
    getchar();  // stops if delta t = total T or projectile landed 
} 

yOld = yNew; // refresh x & y 
xOld = xNew; 
} 
0

Вы должны либо изменить

xNew = xOld + velocityX * time; // works out displacement for X 

к

xNew = xOld + velocityX * deltaTime; // works out displacement for X 

или удалить

xOld = xNew; 

в конце, как оставить оба неизменны даст вам квадратично превышение скорости x, а не lin уха с постоянной скоростью.

Смежные вопросы