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