角色靠近一条由多段直线组成的路线时,最近处可能位于某段内部,也可能正好是拐点。只比较路线节点会漏掉线段中间的位置,直接延长直线则可能把落点放到路线外。
本篇使用一组可以手算或逐行复查的虚构游戏记录。先读清操作顺序与边界,再看完整过程;它不是某一款现有游戏的隐藏公式,也不要求读者安装工具。
每条路线有六个不同相邻节点,连接为五段。对角色位置计算在线段方向上的投影参数,再限制在零到一;比较各段最近点的距离平方,同分取段编号较小者。所有结果保留分数。
六节点按路径顺序[[9, 4], [3, 2], [0, 7], [6, 5], [1, 2], [9, 1]] 七个查询位置[[-1, 8], [5, 6], [2, 1], [5, 9], [0, 4], [3, 10], [0, 2]]
角色位置[-1, 8],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['13/10', '1', ['3', '2'], '52'], ['21/17', '1', ['0', '7'], '2'], ['-1/5', '0', ['0', '7'], '2'], ['13/17', '13/17', ['37/17', '46/17'], '648/17'], ['-22/65', '0', ['1', '2'], '40']]。最小者为第1段,最终点['0', '7'],距离平方2。
角色位置[5, 6],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['1/2', '1/2', ['6', '3'], '10'], ['7/17', '7/17', ['30/17', '69/17'], '242/17'], ['4/5', '4/5', ['24/5', '27/5'], '2/5'], ['1/17', '1/17', ['97/17', '82/17'], '32/17'], ['28/65', '28/65', ['289/65', '102/65'], '1296/65']]。最小者为第2段,最终点['24/5', '27/5'],距离平方2/5。
角色位置[2, 1],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['6/5', '1', ['3', '2'], '2'], ['-1/17', '0', ['3', '2'], '2'], ['3/5', '3/5', ['18/5', '29/5'], '128/5'], ['16/17', '16/17', ['22/17', '37/17'], '32/17'], ['9/65', '9/65', ['137/65', '121/65'], '49/65']]。最小者为第4段,最终点['137/65', '121/65'],距离平方49/65。
角色位置[5, 9],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['7/20', '7/20', ['69/10', '33/10'], '361/10'], ['29/34', '29/34', ['15/34', '213/34'], '961/34'], ['13/20', '13/20', ['39/10', '57/10'], '121/10'], ['-7/34', '0', ['6', '5'], '17'], ['5/13', '5/13', ['53/13', '21/13'], '720/13']]。最小者为第2段,最终点['39/10', '57/10'],距离平方121/10。
角色位置[0, 4],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['27/20', '1', ['3', '2'], '13'], ['19/34', '19/34', ['45/34', '163/34'], '81/34'], ['3/20', '3/20', ['9/10', '67/10'], '81/10'], ['33/34', '33/34', ['39/34', '71/34'], '169/34'], ['-2/13', '0', ['1', '2'], '5']]。最小者为第1段,最终点['45/34', '163/34'],距离平方81/34。
角色位置[3, 10],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['3/5', '3/5', ['27/5', '14/5'], '288/5'], ['20/17', '1', ['0', '7'], '18'], ['3/10', '3/10', ['9/5', '32/5'], '72/5'], ['0', '0', ['6', '5'], '34'], ['8/65', '8/65', ['129/65', '122/65'], '4356/65']]。最小者为第2段,最终点['9/5', '32/5'],距离平方72/5。
角色位置[0, 2],五段候选依次为[原参数,限制后参数,最近点,距离平方]:[['29/20', '1', ['3', '2'], '9'], ['9/34', '9/34', ['75/34', '113/34'], '225/34'], ['1/4', '1/4', ['3/2', '13/2'], '45/2'], ['39/34', '1', ['1', '2'], '1'], ['-8/65', '0', ['1', '2'], '1']]。最小者为第3段,最终点['1', '2'],距离平方1。
逐查询比较全部线段,限制参数后再进行距离比较,拐点同分按编号处理。
独立检查投影参数:在线段内部时,角色到投影点的向量与线段垂直;被限制到端点时,未限制参数应落在相应边界外。最后比较全部五个有效候选,不能先随意选一段再声称得到全局最近点。
最近位置只描述几何距离,不保证角色能穿过障碍抵达,也不等于应该朝哪个方向前进。自交路线可能出现多个同样近的点,使用稳定的同分规则有助于复查,却不能代替实际路径跟随的进度管理。
练习时可以只改变一个输入,再预测哪一步会最先改变。保留中间记录,检查空状态、相等数值和刚好落在边界的情况。最终结果碰巧相同,并不能证明两个过程等价;反过来,采用不同规则得出不同结果,也不应立即视作程序故障。
以便获取最新的优惠活动以及最新资讯!