我正在做一个小游戏,我有一个可以向各个方向移动的角色(x和y),他的速度只存储在两个整数vx
和vy
中。现在,我想将他限制在一个固定区域,但这个区域不应该是正方形,而应该是一个圆形。我可以通过简单应用距离公式轻松检测角色何时在圆圈之外,但这不是问题。我不知道该怎么做。如何计算圆内最近点到越界坐标?更重要的是,我如何弄清楚如何修改速度变量以匹配这个边界?
到目前为止,我已经确定我可以通过一些简单的三角函数找到圆上最近的点:
double angle = Math.atan2(posX, posY);
posX = (int)(Math.cos(angle)/radius);
posY = (int)(Math.sin(angle)/radius);
但这似乎可以改进。我完全迷失了另一个元素。请帮忙吗?
答案 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*=k
和vy*=k
来模拟撞击边界,其中k
是 -1之间的阻尼常数和0。
作为额外的触摸,您可以通过
使角色在边界附近变慢vx*=k*[(r-D)/r]
这个额外的术语是必需的,因为比例因子取决于位置:更接近边界,我们希望速度更低。在这里,k
介于0和正1之间,因为我们只是放慢速度而不是反转。
答案 1 :(得分:0)
根据你的问题,我想知道你想弄清楚对象的给定位置是否代表边界位置 - 即,例如,检测它是否不能从该位置向左移动。
我认为直截了当的方法是在任何移动之前有一个检查功能。也就是说,查看移动对于给定位置是否有效 - 这可以通过查看该操作的结果是否导致对象超出边界来完成。如果检查返回true,则可以执行该操作。如果检查返回false - 不允许该移动。