角色靠近一条由多段直线组成的路线时,最近处可能位于某段内部,也可能正好是拐点。只比较路线节点会漏掉线段中间的位置,直接延长直线则可能把落点放到路线外。

本篇使用一组可以手算或逐行复查的虚构游戏记录。先读清操作顺序与边界,再看完整过程;它不是某一款现有游戏的隐藏公式,也不要求读者安装工具。

规则与输入

每条路线有六个不同相邻节点,连接为五段。对角色位置计算在线段方向上的投影参数,再限制在零到一;比较各段最近点的距离平方,同分取段编号较小者。所有结果保留分数。

六节点按路径顺序[[0, 3], [0, 7], [2, 5], [3, 6], [4, 3], [1, 8]] 七个查询位置[[9, 2], [-2, 9], [7, 5], [7, 4], [8, 6], [6, 4], [7, -2]]

逐步计算与结果

角色位置[9, 2],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['-1/4', '0', ['0', '3'], '82'], ['7/2', '1', ['2', '5'], '58'], ['2', '1', ['3', '6'], '52'], ['9/5', '1', ['4', '3'], '26'], ['-10/17', '0', ['4', '3'], '26']]。最小者为第3段,最终点['4', '3'],距离平方26。

角色位置[-2, 9],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['3/2', '1', ['0', '7'], '8'], ['-1', '0', ['0', '7'], '8'], ['0', '0', ['2', '5'], '32'], ['-7/5', '0', ['3', '6'], '34'], ['24/17', '1', ['1', '8'], '10']]。最小者为第0段,最终点['0', '7'],距离平方8。

角色位置[7, 5],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['1/2', '1/2', ['0', '5'], '49'], ['9/4', '1', ['2', '5'], '25'], ['5/2', '1', ['3', '6'], '17'], ['7/10', '7/10', ['37/10', '39/10'], '121/10'], ['1/34', '1/34', ['133/34', '107/34'], '441/34']]。最小者为第3段,最终点['37/10', '39/10'],距离平方121/10。

角色位置[7, 4],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['1/4', '1/4', ['0', '4'], '49'], ['5/2', '1', ['2', '5'], '26'], ['2', '1', ['3', '6'], '20'], ['1', '1', ['4', '3'], '10'], ['-2/17', '0', ['4', '3'], '10']]。最小者为第3段,最终点['4', '3'],距离平方10。

角色位置[8, 6],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['3/4', '3/4', ['0', '6'], '64'], ['9/4', '1', ['2', '5'], '37'], ['7/2', '1', ['3', '6'], '25'], ['1/2', '1/2', ['7/2', '9/2'], '45/2'], ['3/34', '3/34', ['127/34', '117/34'], '841/34']]。最小者为第3段,最终点['7/2', '9/2'],距离平方45/2。

角色位置[6, 4],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['1/4', '1/4', ['0', '4'], '36'], ['9/4', '1', ['2', '5'], '17'], ['3/2', '1', ['3', '6'], '13'], ['9/10', '9/10', ['39/10', '33/10'], '49/10'], ['-1/34', '0', ['4', '3'], '5']]。最小者为第3段,最终点['39/10', '33/10'],距离平方49/10。

角色位置[7, -2],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['-5/4', '0', ['0', '3'], '74'], ['4', '1', ['2', '5'], '74'], ['-1', '0', ['2', '5'], '74'], ['14/5', '1', ['4', '3'], '34'], ['-1', '0', ['4', '3'], '34']]。最小者为第3段,最终点['4', '3'],距离平方34。

逐查询比较全部线段,限制参数后再进行距离比较,拐点同分按编号处理。

怎样独立复核

独立检查投影参数:在线段内部时,角色到投影点的向量与线段垂直;被限制到端点时,未限制参数应落在相应边界外。最后比较全部五个有效候选,不能先随意选一段再声称得到全局最近点。

最近位置只描述几何距离,不保证角色能穿过障碍抵达,也不等于应该朝哪个方向前进。自交路线可能出现多个同样近的点,使用稳定的同分规则有助于复查,却不能代替实际路径跟随的进度管理。

练习时可以只改变一个输入,再预测哪一步会最先改变。保留中间记录,检查空状态、相等数值和刚好落在边界的情况。最终结果碰巧相同,并不能证明两个过程等价;反过来,采用不同规则得出不同结果,也不应立即视作程序故障。