C++ 反弹物体的三角法

C++ 反弹物体的三角法,c++,user-interface,math,drawing,trigonometry,C++,User Interface,Math,Drawing,Trigonometry,我需要在绘图区域内移动对象。该对象随机移动,每当它碰到墙壁时,就会产生pi/2反弹。(就像乒乓球比赛中的球) 使用两个增量“dx”和“dy”很容易,当它与限制冲突时,我只需更改适当的符号。但在这张照片上,我的物体通过VCO(θ)=x和vsin(θ)=y移动。当它撞击墙壁时,我需要θ加上π/2或减去π/2,这样新的θ在(x,y)上产生新的方向 但我怀疑一定有一种方法比我的更好。我可以单独检查每个屏幕限制(上、左、右、下)θ和增量/减量的值,以产生pi/2反弹。但这将导致大量的if()语句,我相信一

我需要在绘图区域内移动对象。该对象随机移动,每当它碰到墙壁时,就会产生pi/2反弹。(就像乒乓球比赛中的球)

使用两个增量“dx”和“dy”很容易,当它与限制冲突时,我只需更改适当的符号。但在这张照片上,我的物体通过VCO(θ)=x和vsin(θ)=y移动。当它撞击墙壁时,我需要θ加上π/2或减去π/2,这样新的θ在(x,y)上产生新的方向

但我怀疑一定有一种方法比我的更好。我可以单独检查每个屏幕限制(上、左、右、下)θ和增量/减量的值,以产生pi/2反弹。但这将导致大量的
if()
语句,我相信一定有一种聪明的方法来实现这一点

我的代码是

    ball.x += ball.vel * cos(ball.theta);
    ball.y += ball.vel * sin(ball.theta);

    if( (ball.x + ball.radius) >= window.width || (ball.x - ball.radius) <= 0
    || (ball.y + ball.radius) >= window.height || (ball.y - ball.radius) <= 0) {
        ball.theta += M_PI / 2;
其中,
theta
表示给它提供方向的角度,
dt
尚未使用,
vel
是它的速度,到目前为止是恒定的

有没有什么方法可以让我用三角函数以一种智能的方式来做这个弹跳,并且减少cpu的工作量

编辑:将加法从度更改为弧度。


但它仍然表现糟糕。它会像预期的那样反弹几次,我现在看不出有什么原因,它会反弹,并沿着相反的轨迹。(就像它在那个时候改变180度一样)

发送到正余弦函数的角度必须是弧度而不是度。

发送到正余弦函数的角度必须是弧度而不是度。

您的逻辑似乎是错误的。垂直碰撞时,球的速度应从垂直轴反射,水平碰撞时,球的速度应从水平轴反射。轴线:

 if ((ball.x + ball.radius) >= window.width || (ball.x - ball.radius) <= 0)
        ball.theta = M_PI - ball.theta;
  else
     if ((ball.y + ball.radius) >= window.height || (ball.y - ball.radius) <= 0) 
           ball.theta = - ball.theta;

如果((ball.x+ball.radius)>=window.width | |(ball.x-ball.radius)=window.height | |(ball.y-ball.radius)您的逻辑似乎是错误的。垂直碰撞时,球的速度应从垂直轴反射,水平碰撞时,球的速度应从水平轴反射。轴:

 if ((ball.x + ball.radius) >= window.width || (ball.x - ball.radius) <= 0)
        ball.theta = M_PI - ball.theta;
  else
     if ((ball.y + ball.radius) >= window.height || (ball.y - ball.radius) <= 0) 
           ball.theta = - ball.theta;

if((ball.x+ball.radius)>=window.width | |(ball.x-ball.radius)=window.height | |(ball.y-ball.radius)如果您总是打开PI/2。当从求和的cos()或sin()的三角公式


但使用绝对弹性碰撞和dx或dy的变化符号取决于碰撞方向更简单。

如果总是打开PI/2。当从求和的cos()或sin()的三角公式


<>但使用绝对弹性碰撞和改变符号为DX或DY取决于碰撞方向。< / P>如果是C++,则<代码> Sin < /C> >和代码> COS取弧度角,而不是度,但看起来你应该加90,当你应该添加PI / 2时。@阿德里安麦卡锡你是对的,我改变了它,但有时它STI。LL给了我一个回弹(编辑了这个问题)如果这是C++,那么代码> Sin < /COD>和 COS取弧度的角度,而不是度,但是看起来你应该增加90,当你应该添加PI / 2时。@阿德里安麦克卡西你是对的,我改变了它,但有时它仍然给了我反弹(编辑了这个问题)。我改变了它,它在一个方向上做得更好。但是仍然不正常。我改变了它,它在一个方向上做得更好。但是仍然不正常。是的,我昨天设法在报纸上得到了它,但是我很累来这里编辑这个问题,但是你的回答很好。谢谢!是的,我昨天设法在报纸上得到了它,但是w我很高兴来到这里编辑这个问题,但是你的回答很好。谢谢!
new_dx = vel*cos(theta + PI/2) = vel * (-sin(theta)) = -old_dy;
new_dy = vel*sin(theta + PI/2) = vel * cos(theta) = old_dx;
new_dx = vel*cos(theta - PI/2) = vel * sin(theta) = old_dy;
new_dy = vel*sin(theta - PI/2) = vel * (-cos(theta)) = -old_dx;