5

我试图让一个球在窗户周围反弹。取决于球撞击墙壁的距离和角度将决定它的反射。您可以在图片中看到黑色轨迹撞击内半部的对面墙壁......而灰色轨迹表示如果它要反射并撞击另一半......这将减少反射角度。

我不确定我是否正确地考虑它......我试图以度数来表示坐标。

所以给定图片...你会采取那些三角洲,然后获得学位...

度数 = Math.atan2(相反/相邻)= (-4/-2)

在此处输入图像描述

我的代码

public class Calculate {

public Calculate() {
    System.out.println(getCalc(7,5,4,0));       
}

public double getCalc(int x1, int x2, int y1, int y2) {
    double deltaX = Math.abs(x2-x1);
    double deltaY = Math.abs(y2-y1);
    double degrees = Math.toDegrees((java.lang.Math.atan2(deltaX, deltaY)));

    return degrees;
}

}

给出输出:26.56505117707799

所以现在我知道球会以 26 度角从墙上反射(因为那是入射角)。但我不希望球一定会从每面墙上均匀反射,这样会增加可变性。

我的问题:

  • 我是否正确计算了球的角度?
  • 如何根据弹跳在墙上的位置为弹跳添加可变性?
  • 一旦我以度为单位获得角度,我如何将其转换回坐标?

谢谢!

4

3 回答 3

2

我是否正确计算了球的角度?

您的绘图不是按比例绘制的。26 度是从垂直于墙壁的线测量的。

如何根据弹跳在墙上的位置为弹跳添加可变性?

您已经建议了一个随机角度。您还可以根据与墙中心的距离调整反射角度。

将您的反射角度计算放入自己的方法中。您可以调整计算,直到您的计算为您提供您正在寻找的“随机性”。

一旦我以度为单位获得角度,我如何将其转换回坐标?

将度数转换为弧度,然后计算三角形的 SAS。只需将您的角度留在模型中的弧度中,然后在您的显示/诊断方法中转换为度数。

于 2013-07-26T15:41:00.127 回答
1

我认为球与表面的距离对角度并没有真正的影响。当球离开表面时,球在击中表面之前的角度应该相同(镜面反射),以使其自然。

您可以通过考虑橡胶球会发生什么来添加一些可变性,因为它会根据力等在撞击时发生一些变化,因此每次的反射并不完全相同。您可以简单地随机添加或删除一两个学位,然后看看效果如何。

一旦你有了一个角度,它就会再次归结为三角学。您有一个角度,并且您知道斜边(我假设根据您的帧速率和球速,球会从表面行进一定量)。因此,您需要从中获得三角形的相邻线和相反线。

例如:

sin(angle) * hypothenuse = opposite (so Y offset from the surface).

cos(angle) * hypothenuse = adjacent (so X offset from the point of contact).

只需从接触点的坐标中添加或删除(取决于方向)相邻和相反的值。

于 2013-07-26T15:41:27.150 回答
1

如果你想让它看起来有点随机,你可以对旋转进行一些建模——它不必太复杂。

如果它没有旋转并以 45 度角撞到墙壁,它将使球旋转。当它撞到下一堵墙时,旋转会增加角度,旋转会增加(或减少)角度。我认为旋转/角度组合也会影响它从墙上掉下来的速度(只是想象现实生活中的情况)

这会使它在没有真正随机的情况下发生变化——但我不知道它实际上会是什么样子——你可能必须应用其他限制(我认为必须有一种方法来限制最大旋转)。

我敢打赌,如果您不只是想制定规则,那么周围有一本简单的物理学书可以提供足够的模型来进行建模,而无需深入研究数学。

于 2013-07-26T15:51:47.627 回答