2

我正在尝试编写一个简单的 c++ 程序,一旦它到达特定点,它就会输出对象的当前高度。我想要完成的目标是,你有一个从不同位置开始的物体,a 在随机速度下移动,并附有重力。如果球撞到墙壁或其他物体,它应该向后移动,没有能量损失,但仍会因重力而继续下落。一旦球达到特定高度,输出该值。

现在,我现在要做的就是检查我的球是否超出了我的宽度范围。但是对于我的生活,我不明白为什么我在底部的最后一个 if 语句不会调用。

我错过/做一些非常愚蠢的事情吗?

  int _tmain(int argc, _TCHAR* argv[])
{

    float velocity;
    float height, targetHeight;
    float gravity;
    float time;
    float angle;
    float width;
    float move;
    float distance; 

    gravity = 9.80f;
    time = 0;
    distance = 0;

    cout << "Set Height\n";
    cin >> height;

    cout << "Set target height\n";
    cin >> targetHeight;

    cout << "Set Angle ( 0 - 90 ): \n";
    cin >> angle;
    angle *= 3.14 * 180; // convert to radians

    cout << "Set velocity (0 - 100): \n";
    cin >> velocity;

    cout << "Set Play field Width: \n";
    cin >> width;


    while( height >= target  )
    {
        time++;
        distance += velocity * cos(angle) * time;
        height += (velocity * sin(angle) * time) - (gravity * pow(time, 2) ) / 2;
    }

    if( distance == width)
    {
            cout << "You've hit the wall\n";
    }

    return 0;
}
4

3 回答 3

3

您的最终if陈述if( distance == width )不会测试距离是否超出宽度。你可能想要if( distance >= width ). 似乎没有对您的运动循环内行进的距离进行任何测试,因此距离很容易大于宽度,从而导致您的 if 不正确。

于 2013-06-01T17:27:45.817 回答
1

以相同的速度向后移动:velocity = -velocity;。当然,如果它向后移动,它可能会撞到另一面墙,所以你可能也想检查一下distance == 0;。(由于它是浮点数,我还建议您使用>=and<=而不是精确比较,或者您可能会发现球距离墙壁一微米,然后继续直到它碰到太阳,或者您用完了数学,或其他任何东西如果你永远继续下去,就会发生)。

我会进一步建议您需要球在其中弹跳的“房间”的宽度和宽度。因此,您总共需要球的 X、Y 和 Z 坐标。

于 2013-06-01T17:29:36.553 回答
1

注意:您的时间不断增加,这意味着高度和距离的直接公式(一种说法distance = f(time);),但您正在积累。

所以可能你想分配而不是增加你的distanceheight变量:

   distance = velocity * cos(angle) * time;
   height = (velocity * sin(angle) * time) - (gravity * pow(time, 2) ) / 2;

接下来,您可能想检查行进的距离是否distance 超过到墙壁的距离(与floats 相等是非常不可能的,而且不准确)。

一些风格上的建议:将这些方程放在它们自己的函数中。

于 2013-06-01T18:11:25.883 回答