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