这是有问题的代码:
public void calculate() {
// Center of circle is at (250, 250).
//THIS ALGORITHM IS NOW PROVEN TO BE WORSE THAN I FEARED...
/* What it does:
* Moves object around in a circle.
* Does not move the object towards the center.
* Object always stays on the rim of the circle.
*
* Algorithm I used. (DOES NOT WORK):
* N is normalized vector.
* R = -2*(V dot N)*N + V
*/
vx += Accelero.X * 0.1;
vy += Accelero.Y * 0.1;
double nx = x - 250;
double ny = y - 250;
double nd = Math.hypot(nx, ny);
if (nd == 0)
nd = 1;
nx /= nd;
ny /= nd;
double dotProduct = vx * nx + vy * ny;
vx += (float) (-2 * dotProduct * nx);
vy += (float) (-2 * dotProduct * ny);
x -= vx * 2;
y -= vy * 2;
vx *= 0.99;
vy *= 0.99;
}
这就是发生的事情。
您看到的黑线是紫色物体(盒子)移动的位置。它恰好位于我用 Canvas.drawCircle() 绘制的圆线上。
我不明白为什么反射不起作用。如果一个物体要撞击圆形墙壁,它不应该反射(reflect)物体的速度方向,这就是算法的目的吗?或者我使用了错误的算法?
感谢任何帮助。提前致谢。
最佳答案
你能从任意角度的直墙上弹跳吗?这应该是第一步。 (您可能会发现速度 vector 的极坐标表示更容易使用。)
一旦你完成了这个工作,它应该相当简单:从圆上反弹就像从接触点接触该圆的切线反弹一样。
您可以通过观察它垂直于接触点的半径 vector (即从对象所在位置指向圆心的 vector )来计算该切线
关于java - 想让物体在圆内弹跳,结果却让物体沿着圆的边缘移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12040547/