Math 路径上最接近某个点的点,或:亲爱的目标,对不起,我错过了你

Math 路径上最接近某个点的点,或:亲爱的目标,对不起,我错过了你,math,geometry,Math,Geometry,对于我正在进行的2D游戏,我想计算出一个投射物何时到达离目标最近的点 投射物是每帧以恒定dx,dy移动的点。 目标是另一点,其相对于射弹的速度足够慢,以至于被认为是静止的。 我想让射弹在尽可能接近目标时爆炸 计算这个的好方法是什么 绝对精度并不重要,这是对已在服务器上解决的事件的客户端模拟。我更喜欢快速简单的算法,而不是像素完美的算法。计算与目标相交路径的法线。法线与路径的交点将是路径上距离目标最近的点。点与线之间的最小距离:(这实际上就是问题的症结所在) 更多参考资料,请参见他的一般几何部分

对于我正在进行的2D游戏,我想计算出一个投射物何时到达离目标最近的点

投射物是每帧以恒定dx,dy移动的点。 目标是另一点,其相对于射弹的速度足够慢,以至于被认为是静止的。 我想让射弹在尽可能接近目标时爆炸

计算这个的好方法是什么


绝对精度并不重要,这是对已在服务器上解决的事件的客户端模拟。我更喜欢快速简单的算法,而不是像素完美的算法。

计算与目标相交路径的法线。法线与路径的交点将是路径上距离目标最近的点。

点与线之间的最小距离:(这实际上就是问题的症结所在)

更多参考资料,请参见他的一般几何部分:


记录上一段距离,并在距离开始增加的第一刻检查

if ((currentDistance==0) || (currentDistance > previousDistance)) Explode()
之所以如此简单,是因为路径几何体很简单(即,一条直线),但它工作得很好

当目标速度比您描述的还要快时,只要两条轨迹都是直的(或者至少是柔和的弯曲),这样做还有一个额外的优点


限制,与爆炸的“大小”相比,您的步长需要较小,否则将无法正常工作。在这种情况下,您需要预先计算下一个距离…

看起来您的“投射物”基本上是沿直线移动的

可视化的一个简单方法是变换二维平面,使直线成为x轴。这将涉及arctan(dy/dx)的旋转

对相关点应用相同的变换,并获得y坐标


如果您愿意,您可以手动执行此操作并找出答案,但游戏API应该已经非常适合此操作。

您可以使用毕达哥拉斯定理,该定理仅使用(a)2+(b)2=(c)2公式。所以,距离等于乘积的平方根。这是一篇关于如何使用网格上的点来实现它的好文章

建议的副本()不存在。也没有任何问题要求直线上的最接近点,因为此版本允许逐步近似,当应用于“如何找到直线上最近的点?”时,这将是错误的。