放大地图时,如果只是改变倍率,光标下原本指向的位置可能被推走。把该世界点作为缩放锚点,并同时调整镜头原点,可以让观察位置留在光标下。
下面是一组独立的虚构游戏输入与逐步结果。先记录单位、编号和端点是否包含,再尝试自己推算,最后对照第一处差异。所有结论都以本例规则为前提;其他作品采用不同约定时,应按它自己的说明重新计算。
本例规则与数据
屏幕坐标等于世界坐标减镜头原点后乘缩放倍率。每次先用旧倍率和原点求出光标下的世界点,再改倍率并反求新原点;两个坐标轴独立计算,无旋转或边界夹取,精确分数不取整。
初始原点['-1', '0'],倍率1 [[[6, -9], '1/2'], [[-7, -11], '3/2'], [[-2, 7], '1/2'], [[0, -7], '3/2'], [[11, -3], '2'], [[-11, -5], '3'], [[1, 1], '1/2'], [[-12, 12], '2'], [[5, 4], '3'], [[-9, -1], '3/2']]
过程记录
光标[6, -9],倍率1改为1/2;原点['-1', '0']下的世界锚点['5', '-9'],调整后原点['-7', '9']。
光标[-7, -11],倍率1/2改为3/2;原点['-7', '9']下的世界锚点['-21', '-13'],调整后原点['-49/3', '-17/3']。
光标[-2, 7],倍率3/2改为1/2;原点['-49/3', '-17/3']下的世界锚点['-53/3', '-1'],调整后原点['-41/3', '-15']。
光标[0, -7],倍率1/2改为3/2;原点['-41/3', '-15']下的世界锚点['-41/3', '-29'],调整后原点['-41/3', '-73/3']。
光标[11, -3],倍率3/2改为2;原点['-41/3', '-73/3']下的世界锚点['-19/3', '-79/3'],调整后原点['-71/6', '-149/6']。
光标[-11, -5],倍率2改为3;原点['-71/6', '-149/6']下的世界锚点['-52/3', '-82/3'],调整后原点['-41/3', '-77/3']。
光标[1, 1],倍率3改为1/2;原点['-41/3', '-77/3']下的世界锚点['-40/3', '-76/3'],调整后原点['-46/3', '-82/3']。
光标[-12, 12],倍率1/2改为2;原点['-46/3', '-82/3']下的世界锚点['-118/3', '-10/3'],调整后原点['-100/3', '-28/3']。
光标[5, 4],倍率2改为3;原点['-100/3', '-28/3']下的世界锚点['-185/6', '-22/3'],调整后原点['-65/2', '-26/3']。
光标[-9, -1],倍率3改为3/2;原点['-65/2', '-26/3']下的世界锚点['-71/2', '-9'],调整后原点['-59/2', '-25/3']。
最后倍率3/2,镜头原点['-59/2', '-25/3'];每次缩放保持的是本次光标所指世界点。
独立核对与实际应用
将每步得到的世界锚点代回新旧两套变换,屏幕位置都必须等于本次光标位置。还可以将原点变化写成光标坐标乘两次倍率倒数之差,独立复算。
相邻操作可以使用不同光标位置,所以镜头原点不会简单沿同一方向变化。如果镜头被限制在地图边缘,严格保持锚点可能与边界约束冲突,本例没有加入那种夹取。缩放改变的是观看范围,不改变地图实际尺寸。
测试时先保留输入和中间状态,再只改变一个条件。空状态、正好相等、重复出现和最后一步都值得单独检查。若最终结果不符,应从第一处偏差查起,而不是在末尾随意增加补偿让数字表面一致。
![九游会招商[J9总代理]招商合作官方网站](https://agent-j9iuyouhui-j9.com/upload/image/jiu-you-hui-zhao-shang-J9-zong-dai-li-zhao-shang-he-zuo-guan-fang-wang-zhan-logo.webp)