角色靠近一条由多段直线组成的路线时,最近处可能位于某段内部,也可能正好是拐点。只比较路线节点会漏掉线段中间的位置,直接延长直线则可能把落点放到路线外。
本篇使用一组可以手算或逐行复查的虚构游戏记录。先读清操作顺序与边界,再看完整过程;它不是某一款现有游戏的隐藏公式,也不要求读者安装工具。
规则与输入
每条路线有六个不同相邻节点,连接为五段。对角色位置计算在线段方向上的投影参数,再限制在零到一;比较各段最近点的距离平方,同分取段编号较小者。所有结果保留分数。
六节点按路径顺序[[0, 2], [3, 6], [6, 5], [5, 5], [0, 0], [7, 0]] 七个查询位置[[1, 2], [9, 0], [9, 8], [-2, 0], [0, 6], [0, 10], [3, 3]]
逐步计算与结果
角色位置[1, 2],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['3/25', '3/25', ['9/25', '62/25'], '16/25'], ['-1/5', '0', ['3', '6'], '20'], ['5', '1', ['5', '5'], '25'], ['7/10', '7/10', ['3/2', '3/2'], '1/2'], ['1/7', '1/7', ['1', '0'], '4']]。最小者为第3段,最终点['3/2', '3/2'],距离平方1/2。
角色位置[9, 0],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['19/25', '19/25', ['57/25', '126/25'], '1764/25'], ['12/5', '1', ['6', '5'], '34'], ['-3', '0', ['6', '5'], '34'], ['1/10', '1/10', ['9/2', '9/2'], '81/2'], ['9/7', '1', ['7', '0'], '4']]。最小者为第4段,最终点['7', '0'],距离平方4。
角色位置[9, 8],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['51/25', '1', ['3', '6'], '40'], ['8/5', '1', ['6', '5'], '18'], ['-3', '0', ['6', '5'], '18'], ['-7/10', '0', ['5', '5'], '25'], ['9/7', '1', ['7', '0'], '68']]。最小者为第1段,最终点['6', '5'],距离平方18。
角色位置[-2, 0],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['-14/25', '0', ['0', '2'], '8'], ['-9/10', '0', ['3', '6'], '61'], ['8', '1', ['5', '5'], '74'], ['6/5', '1', ['0', '0'], '4'], ['-2/7', '0', ['0', '0'], '4']]。最小者为第3段,最终点['0', '0'],距离平方4。
角色位置[0, 6],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['16/25', '16/25', ['48/25', '114/25'], '144/25'], ['-9/10', '0', ['3', '6'], '9'], ['6', '1', ['5', '5'], '26'], ['2/5', '2/5', ['3', '3'], '18'], ['0', '0', ['0', '0'], '36']]。最小者为第0段,最终点['48/25', '114/25'],距离平方144/25。
角色位置[0, 10],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['32/25', '1', ['3', '6'], '25'], ['-13/10', '0', ['3', '6'], '25'], ['6', '1', ['5', '5'], '50'], ['0', '0', ['5', '5'], '50'], ['0', '0', ['0', '0'], '100']]。最小者为第0段,最终点['3', '6'],距离平方25。
角色位置[3, 3],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['13/25', '13/25', ['39/25', '102/25'], '81/25'], ['3/10', '3/10', ['39/10', '57/10'], '81/10'], ['3', '1', ['5', '5'], '8'], ['2/5', '2/5', ['3', '3'], '0'], ['3/7', '3/7', ['3', '0'], '9']]。最小者为第3段,最终点['3', '3'],距离平方0。
逐查询比较全部线段,限制参数后再进行距离比较,拐点同分按编号处理。
怎样独立复核
独立检查投影参数:在线段内部时,角色到投影点的向量与线段垂直;被限制到端点时,未限制参数应落在相应边界外。最后比较全部五个有效候选,不能先随意选一段再声称得到全局最近点。
最近位置只描述几何距离,不保证角色能穿过障碍抵达,也不等于应该朝哪个方向前进。自交路线可能出现多个同样近的点,使用稳定的同分规则有助于复查,却不能代替实际路径跟随的进度管理。
练习时可以只改变一个输入,再预测哪一步会最先改变。保留中间记录,检查空状态、相等数值和刚好落在边界的情况。最终结果碰巧相同,并不能证明两个过程等价;反过来,采用不同规则得出不同结果,也不应立即视作程序故障。
