如何将一组坐标约束到圆形区域?

时间:2011-12-11 04:51:55

标签: java math trigonometry

我正在做一个小游戏,我有一个可以向各个方向移动的角色(x和y),他的速度只存储在两个整数vxvy中。现在,我想将他限制在一个固定区域,但这个区域不应该是正方形,而应该是一个圆形。我可以通过简单应用距离公式轻松检测角色何时在圆圈之外,但这不是问题。我不知道该怎么做。如何计算圆内最近点到越界坐标?更重要的是,我如何弄清楚如何修改速度变量以匹配这个边界?

到目前为止,我已经确定我可以通过一些简单的三角函数找到圆上最近的点:

double angle = Math.atan2(posX, posY);
posX = (int)(Math.cos(angle)/radius);
posY = (int)(Math.sin(angle)/radius);

但这似乎可以改进。我完全迷失了另一个元素。请帮忙吗?

2 个答案:

答案 0 :(得分:2)

假设圆的中心位于(0,0),确切的值实际上非常合理。

当角色超出范围时,我们会通过r/D缩放旧值来将角色带回边界,其中D=sqrt(x^2+y^2)

x*=r/D
y*=r/D

注意:这实际上与您使用trig的方式相同,因为

r*cos(tan(y/x))=r*x/sqrt(x^2+y^2)

然后,您可以将速度设置为零,或者通过设置vx*=kvy*=k来模拟撞击边界,其中k -1之间的阻尼常数和0。

作为额外的触摸,您可以通过

使角色在边界附近变慢
vx*=k*[(r-D)/r]

这个额外的术语是必需的,因为比例因子取决于位置:更接近边界,我们希望速度更低。在这里,k介于0和正1之间,因为我们只是放慢速度而不是反转。

答案 1 :(得分:0)

根据你的问题,我想知道你想弄清楚对象的给定位置是否代表边界位置 - 即,例如,检测它是否不能从该位置向左移动。

我认为直截了当的方法是在任何移动之前有一个检查功能。也就是说,查看移动对于给定位置是否有效 - 这可以通过查看该操作的结果是否导致对象超出边界来完成。如果检查返回true,则可以执行该操作。如果检查返回false - 不允许该移动。