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

Java 如何将一组坐标约束到圆形区域?,java,math,trigonometry,Java,Math,Trigonometry,我正在做一个小游戏,我有一个角色可以在各个方向(x和y)移动,他的速度存储在两个整数中,vx和vy。现在,我想把他限制在一个固定的区域,但这个区域不应该是正方形,而是圆形。通过简单地应用距离公式,我可以很容易地检测出角色何时在圆之外,但这不是问题所在。我不知道该怎么办。如何计算圆内与越界坐标最近的点?更重要的是,我该如何修改速度变量来匹配这个边界 到目前为止,我已经确定我可以用一些简单的三角法找到圆上最近的点: double angle = Math.atan2(posX, posY); pos

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

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

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

但这似乎是可以改进的。我完全不知道另一个因素。请帮助?

根据您的问题,我推测您想要确定对象的给定位置是否表示边界位置,例如,检测对象是否无法从此位置向左移动


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

假设圆的中心位于
(0,0)
,那么精确的值实际上计算得非常好

当字符超出边界时,我们通过按
r/D
缩放旧值将字符带回到边界,其中
D=sqrt(x^2+y^2)

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

然后可以将速度设置为零,或通过设置
vx*=k
vy*=k
模拟碰撞边界,其中
k
是介于-1和0之间的阻尼常数

作为额外的触摸,您可以通过以下方式使角色在边界附近减速:

vx*=k*[(r-D)/r]

因为比例因子取决于位置,所以需要额外的项:越靠近边界,我们希望速度降低得更多。这里,
k
介于0和正1之间,因为我们只是在减速,而不是反转。

@Derek–这一切都很好,但它没有告诉我如何实际实现这一点。显示如何转换为笛卡尔坐标。@Derek–好的,但我在代码段中已经有了,它似乎对其他部分没有帮助。如果用极坐标表示字符的位置,解决方案应该很清楚。只需缩短距离,从他们所在的地方到他们的内部。好的,谢谢,我明白你的意思。然而,主要的问题是这会同时使两个速度相等。例如,如果字符直接进入圆的右侧,即单位圆上的aka(0,1),
vx
应减弱,但不应
vy
。如果它是垂直的,那么倒数就是真的,在45度角时,它们的阻尼是相等的。虽然有些案件很简单,但让我感到困惑的是那些介于任意案件之间的案件。很有道理。您想单独应用阻尼因子-我将编辑我的答案以澄清。
r*cos(tan(y/x))=r*x/sqrt(x^2+y^2)
vx*=k*[(r-D)/r]