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