我正试图让一个球在窗户周围反弹。取决于球撞到墙壁的距离以及确定其反射的角度。您可以在图片中看到黑色轨迹撞击内半部分的相对墙...而灰色轨迹表示它是否反射并击中另一半...这将减少反射角度。
我不确定我是否正确地考虑它......我正在尝试用度数来设置坐标。
所以考虑到照片...你会拿这些增量,然后获得学位......
度= 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度反射离墙(因为那是入射角)。但是我不希望球必须在每个墙壁上均匀地反射,因此它增加了可变性。
我的问题:
谢谢!
答案 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度角击中墙壁,则会使球旋转。当它撞到下一个墙壁时,旋转将增加到该角度并且旋转将增加(或减小)该角度。我认为旋转/角度组合也会影响它从墙上掉下来的速度(只是想象现实生活中的情况)
这会使它变化而不是真正随机 - 但我不知道它实际上看起来如何 - 你可能必须应用其他限制(我认为必须有一种限制最大旋转的方法) 。
我打赌有一本简单的物理书可以提供足够的模型,如果你不只是想制定规则而不会深入数学。