我不擅长物理,所以我需要帮助。 您不需要主要功能即可理解此代码。 (您可以轻松理解)。此代码(↓)是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 ..但是我不知道...有人帮我吗?
答案 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不变,并假设getMovDir
和setMotionDir
是一个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中并运行以查看问题所在。我不仅无法验证我的建议是否有效,因为没有可以测试的建议,而且我还必须对您的代码做出很多假设。如果这些假设是错误的,那么我的建议也是如此。