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