角色靠近一条由多段直线组成的路线时,最近处可能位于某段内部,也可能正好是拐点。只比较路线节点会漏掉线段中间的位置,直接延长直线则可能把落点放到路线外。
本篇使用一组可以手算或逐行复查的虚构游戏记录。先读清操作顺序与边界,再看完整过程;它不是某一款现有游戏的隐藏公式,也不要求读者安装工具。
每条路线有六个不同相邻节点,连接为五段。对角色位置计算在线段方向上的投影参数,再限制在零到一;比较各段最近点的距离平方,同分取段编号较小者。所有结果保留分数。
六节点按路径顺序[[8, 4], [7, 5], [6, 5], [4, 8], [1, 0], [9, 5]] 七个查询位置[[4, 3], [-1, 5], [10, 1], [-1, 2], [9, 1], [2, 3], [6, 7]]
角色位置[4, 3],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['3/2', '1', ['7', '5'], '13'], ['3', '1', ['6', '5'], '8'], ['-2/13', '0', ['6', '5'], '8'], ['40/73', '40/73', ['172/73', '264/73'], '225/73'], ['39/89', '39/89', ['401/89', '195/89'], '81/89']]。最小者为第4段,最终点['401/89', '195/89'],距离平方81/89。
角色位置[-1, 5],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['5', '1', ['7', '5'], '64'], ['8', '1', ['6', '5'], '49'], ['14/13', '1', ['4', '8'], '34'], ['39/73', '39/73', ['175/73', '272/73'], '961/73'], ['9/89', '9/89', ['161/89', '45/89'], '2500/89']]。最小者为第3段,最终点['175/73', '272/73'],距离平方961/73。
角色位置[10, 1],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['-5/2', '0', ['8', '4'], '13'], ['-3', '0', ['7', '5'], '25'], ['-20/13', '0', ['6', '5'], '32'], ['38/73', '38/73', ['178/73', '280/73'], '4761/73'], ['77/89', '77/89', ['705/89', '385/89'], '1369/89']]。最小者为第0段,最终点['8', '4'],距离平方13。
角色位置[-1, 2],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['7/2', '1', ['7', '5'], '73'], ['8', '1', ['6', '5'], '58'], ['5/13', '5/13', ['68/13', '80/13'], '729/13'], ['63/73', '63/73', ['103/73', '80/73'], '484/73'], ['-6/89', '0', ['1', '0'], '8']]。最小者为第3段,最终点['103/73', '80/73'],距离平方484/73。
角色位置[9, 1],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['-2', '0', ['8', '4'], '10'], ['-2', '0', ['7', '5'], '20'], ['-18/13', '0', ['6', '5'], '25'], ['41/73', '41/73', ['169/73', '256/73'], '3721/73'], ['69/89', '69/89', ['641/89', '345/89'], '1024/89']]。最小者为第0段,最终点['8', '4'],距离平方10。
角色位置[2, 3],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['5/2', '1', ['7', '5'], '29'], ['5', '1', ['6', '5'], '20'], ['2/13', '2/13', ['74/13', '71/13'], '256/13'], ['46/73', '46/73', ['154/73', '216/73'], '1/73'], ['23/89', '23/89', ['273/89', '115/89'], '361/89']]。最小者为第3段,最终点['154/73', '216/73'],距离平方1/73。
角色位置[6, 7],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['5/2', '1', ['7', '5'], '5'], ['1', '1', ['6', '5'], '4'], ['6/13', '6/13', ['66/13', '83/13'], '16/13'], ['2/73', '2/73', ['286/73', '568/73'], '361/73'], ['75/89', '75/89', ['689/89', '375/89'], '961/89']]。最小者为第2段,最终点['66/13', '83/13'],距离平方16/13。
逐查询比较全部线段,限制参数后再进行距离比较,拐点同分按编号处理。
独立检查投影参数:在线段内部时,角色到投影点的向量与线段垂直;被限制到端点时,未限制参数应落在相应边界外。最后比较全部五个有效候选,不能先随意选一段再声称得到全局最近点。
最近位置只描述几何距离,不保证角色能穿过障碍抵达,也不等于应该朝哪个方向前进。自交路线可能出现多个同样近的点,使用稳定的同分规则有助于复查,却不能代替实际路径跟随的进度管理。
练习时可以只改变一个输入,再预测哪一步会最先改变。保留中间记录,检查空状态、相等数值和刚好落在边界的情况。最终结果碰巧相同,并不能证明两个过程等价;反过来,采用不同规则得出不同结果,也不应立即视作程序故障。