2

我一直在用 C# 编写一个简单的程序,其中Ball [X,Y] 坐标是周期性递增的。

我已经设法实现了一种碰撞检测方法,但我试图确定如何以一个角度反射球,使其沿着相同的线性路径反弹回来。

dx = -dx //This bounces the ball back along the same linear path
dy = -dy

三角法

theta = range between 0<theta<=360 depending on where it bounced
x = cos(theta)*time
y=  sin(theta)*time
4

4 回答 4

9

牛顿物理学的全部意义在于它不是随机的,而是确定性的。如果你将同一个球以相同的角度、相同的速度和相同的旋转扔到同一面墙上,它每次都会去同一个地方。

这种程序对于编程和物理来说都是一个非常好的学习机会。我鼓励你首先编写一个模拟非常简单的弹跳的程序。正如您所注意到的,当一个物体直线向下移动并撞击水平表面时,您可以将反弹建模为简单地反转垂直速度分量。做对了;没有重力,什么都没有。这是一个很好的开始。

然后尝试以同样的方式添加水平墙壁的反弹。

然后尝试添加与水平或垂直方向对齐的墙壁的反弹。这就是你必须学习矢量和三角函数如何工作的地方,因为你必须通过斜撞墙壁来计算出球速度的哪个分量。

然后加上重力。然后从空气中增加摩擦力。然后加上球可以旋转的事实。添加弹性,以便您可以对球的变形进行建模。

一旦你达到了这一点,如果你想引入随机性,你将能够弄清楚如何去做。例如,您可以通过说“好吧,当球撞击墙壁并变形时,我将引入一个将其变形改变 0-10% 的随机元素”来引入随机性。然后,这将改变模拟反弹球的方式。您可以尝试不同种类的随机性:例如,添加随机气流。

于 2010-11-12T23:06:19.007 回答
3

您必须自己添加随机性。改写你的问题:“确定地,它以角度 theta 反弹。我怎样才能让它以角度 theta + epsilon 反弹,其中 epsilon 是一些随机值?”

要旋转矢量,请参阅this。您只需指定 theta。

伪代码:

RotateVector(vec):
    bounce_vec = [-vec.x vec.y];  //deterministic answer is negative x, normal y
    bounce_angle = acos(dot(vec,bounce_vec) / (norm(vec)*norm(bounce_vec)));
    modified_angle = bounce_angle + random_number();
    ca = cos(modified_angle);
    sa = sin(modified_angle);
    rotation_matrix = [ca -sa; sa ca];
    return rotation_matrix * vec;

第 3 行使用余弦定律计算角度。在第 4 行中,该角度是随机修改的。该函数的其余部分将原始向量旋转新角度。

于 2010-11-12T23:01:25.383 回答
2

As long as it's a perfect ball with a perfect surface it will not bounce back randomly. Neither vectors nor trigonometry will give you any randomness.

于 2010-11-12T22:50:18.570 回答
0

“尽管适用于物理的基本定律,但随机”似乎是矛盾的。然而...

如果您希望它以随机方向弹跳,同时保持其当前速度,您可以执行以下操作(伪代码):

  • 首先,以规范方式反弹(dx = -dx 或 dy = -dy,取决于碰撞)
  • 然后将 dx 和 dy 转换为极坐标(theta 和 r)
  • 少量抖动theta(+或-几度,根据您的口味)
  • 确保 theta 没有撞到刚刚反弹的墙壁
  • 将 theta 和 r 转换回 dx 和 dy

那将保持标量动量。

于 2010-11-12T23:02:55.963 回答