弹跳球的随机角度

时间:2013-07-26 15:27:41

标签: java angle

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

我不确定我是否正确地考虑它......我正在尝试用度数来设置坐标。

所以考虑到照片...你会拿这些增量,然后获得学位......

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

enter image description here

我的代码

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度反射离墙(因为那是入射角)。但是我不希望球必须在每个墙壁上均匀地反射,因此它增加了可变性。

我的问题:

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

谢谢!

3 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

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

  

一旦我有角度,我怎样才能将其转换回坐标?

将度数转换为弧度,然后计算SAS of the triangle。只需在模型中以弧度为单位保留角度,然后在显示/诊断方法中转换为度数。

答案 1 :(得分:1)

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

你可以通过思考橡胶球会发生什么来增加一些变化,因为根据力的不同,它会在影响上发生一点变化,每次反射都不完全相同。您可以随意添加或删除一两个学位,看看它是如何进行的。

一旦你有一个角度,它再次下降到三角学。你有一个角度,你知道斜边(我认为取决于你的帧率和球速,球会从表面移动一定量)。因此,您需要获得三角形的相邻和相反的线。

例如:

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

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

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

答案 2 :(得分:1)

如果你想让它看起来有点随机,你可以稍微模拟旋转 - 它不必太复杂。

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

这会使它变化而不是真正随机 - 但我不知道它实际上看起来如何 - 你可能必须应用其他限制(我认为必须有一种限制最大旋转的方法) 。

我打赌有一本简单的物理书可以提供足够的模型,如果你不只是想制定规则而不会深入数学。