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