gpt4 book ai didi

java - 想让物体在圆内弹跳,结果却让物体沿着圆的边缘移动

转载 作者:行者123 更新时间:2023-12-01 17:30:00 25 4
gpt4 key购买 nike

这是有问题的代码:

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;
}

这就是发生的事情。

Picture.

您看到的黑线是紫色物体(盒子)移动的位置。它恰好位于我用 Canvas.drawCircle() 绘制的圆线上。

我不明白为什么反射不起作用。如果一个物体要撞击圆形墙壁,它不应该反射(reflect)物体的速度方向,这就是算法的目的吗?或者我使用了错误的算法?

感谢任何帮助。提前致谢。

最佳答案

你能从任意角度的直墙上弹跳吗?这应该是第一步。 (您可能会发现速度 vector 的极坐标表示更容易使用。)

一旦你完成了这个工作,它应该相当简单:从圆上反弹就像从接触点接触该圆的切线反弹一样。

您可以通过观察它垂直于接触点的半径 vector (即从对象所在位置指向圆心的 vector )来计算该切线

关于java - 想让物体在圆内弹跳,结果却让物体沿着圆的边缘移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12040547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com