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