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