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