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