有人请帮我做物理

时间:2018-10-19 08:38:07

标签: c++

我不擅长物理,所以我需要帮助。 您不需要主要功能即可理解此代码。 (您可以轻松理解)。此代码(↓)是updateBallPositions函数,它更新球的位置。

void AnimationFrame::updateBallPositions()
{


    double velocity = balls->getVelocity() ;
    double mvDir = balls->getMovDir();
    double dx = velocity * cos(mvDir);
    double dy = velocity * sin(mvDir);
    double x = balls->get_px();
    double y = balls->get_py();


    if ((x + dx) <= (balls->getRadius()))
    { // ball is bounced by left wall
        mvDir =  balls->getMovDir();
        dx = -dx;
    }

    else if ((x + dx) >= (width - balls->getRadius()))
    {
        // ball is bounced by right wall
        mvDir = (-1)*(PI - balls->getMovDir());
        dx = -dx;

    }


    if ((y + dy) <= (balls->getRadius()))
    { // ball is bounced by upper wall
        mvDir = PI - balls->getMovDir();
        dy = -dy;
    }

    else if ((y + dy) >= (length - balls->getRadius()))
    { // ball is bounced by lower wall
        mvDir = (-1) * balls->getMovDir();
        dy = -dy;
    }


    balls->setMotionDir(mvDir);

    balls->set_px(x + dx);
    balls->set_py(y + dy);
}

结果太糟糕了。我想我应该换mvDir ..但是我不知道...有人帮我吗?

1 个答案:

答案 0 :(得分:1)

例如,假设您的球从右墙弹起。在这里,您大概可以从-pi和pi之间的一个值中获得速度,但没有其余代码,谁知道getMoveDir在做什么。

double mvDir = balls->getMovDir();
double dx = velocity * cos(mvDir);
double dy = velocity * sin(mvDir);

所以现在dx是球向左移动的速度。它撞到了墙,所以

if ((x + dx) <= (balls->getRadius()))
{ // ball is bounced by left wall
    mvDir =  balls->getMovDir();
    dx = -dx;
}

您调高它的速度...而不是mvDir。那仍然代表着球飞入墙壁。然后,您要做的

balls->setMotionDir(mvDir);

什么都不做,因为mvDir不变,并假设getMovDirsetMotionDir是一个getter / setter对。在这种情况下,将其称为“运动”然后称为“运动”是一种误导。然后设置位置

balls->set_px(x + dx);

没问题,dx之前已经被正确地反过。但是,假设没有其他事情发生,那么当使用dx计算速度时,其mvDir将再次指向下一帧墙。我认为这只会使它沿着墙壁抖动或类似的东西。

有趣的是,您实际上确实为另一堵墙更新了mvDir

else if ((x + dx) >= (width - balls->getRadius()))
{
    // ball is bounced by right wall
    mvDir = (-1)*(PI - balls->getMovDir());
    dx = -dx;

}

虽然我没有检查公式是否正确,但老实说我会用atan2完成。

这里有个提示:如果您将所有代码都发布了,那么人们会更愿意(也有能力)为您提供代码帮助。理想情况下,发布一个完整且可运行的示例,使人们可以将其粘贴到IDE中并运行以查看问题所在。我不仅无法验证我的建议是否有效,因为没有可以测试的建议,而且我还必须对您的代码做出很多假设。如果这些假设是错误的,那么我的建议也是如此。