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