Minecraft中投两次末影之眼定位要塞
在Minecraft中使用末影之眼可以寻找要塞。击杀末影人获得的末影珍珠与烈焰粉各1个可合成一颗末影之眼。一般末影珍珠的爆率不高,找到要塞之后进入下界门也需要16只末影之眼,所以更要节省着使用。如何花费尽量少的末影之眼来找到要塞呢,接下来我们使用坐标系变换将要塞的坐标计算出来。
首先,回忆一点数学知识:
- 已知平面直角坐标系的两条不平行的直线,可以求出其交点。利用的是联立两直线方程得到方程组并求其解,两直线不平行则此方程组有且仅有唯一解,此解即是两直线在平面直角坐标系的交点。
- 已知平面一点的坐标和横轴正方向的夹角能唯一确定一条射线,并且可以求出此射线所在直线的方程。
利用的是直线的斜率为此夹角的正切值,将已知点代入直线的点斜式方程即可得到直线方程。
这些都是基础数学常识,我们可以在Minecraft中看一下。
在游戏中按F3(默认快捷键),可以看到左上和右上出现了非常多的数据。我们只需要关心左上角的”XYZ”一行,以及Facing一行即可。
XYZ这一行展示出了我们的坐标,其中y表示高度,所以我们只需要看x和z,而Facing一行最末的括号中是我们的方向,以“方向角/仰角”的格式,我们也只需要看水平的方向角。我们可以在一个地方扔出一颗末影之眼,扔出之后准星对着末影之眼飞出的方向。这样,既有平面坐标(x,z),又有一个夹角,从而确定一条从当前点到要塞连线的射线,
换个地方再扔一次,就得到另一条射线。我们对这两条射线所在的直线联立方程组进行求解,便可以计算出要塞的坐标。可以尝试一下:利用点斜式方程\( z-z_0=tan(\theta)(x-x_0) \),代入联立并解得一个坐标,这个坐标并不是要塞坐标。
数学中惯用的坐标系是\(xy\)逆时针坐标系。过原点的射线与x轴正半轴的夹角绕原点向逆时针增加的。
即沿着夹角为0的射线出发使\(x\)值增大。且夹角为\(90\)度时,使\(y\)值增大。
而Minecraft中的方向角为\(0\)时会使\(z\)方向增大,夹角为\(90\)度时使\(x\)值减小。
说明Minecraft中的坐标系是\(zx\)顺时针坐标系,构建直线方程就不能直接使用我们的结论。
不过我们可以将此\(zx\)顺时针坐标系下变换为\(xy\)逆时针坐标系,再沿用基础数学结论。
对于\(zx\)坐标系,我们记变换后的坐标系为\(x’y’\)逆时针坐标系。
变换矩阵为
\[ \begin{pmatrix} x’ \\ y’ \\ \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & -1 \\ \end{pmatrix} \begin{pmatrix} z \\ x \\ \end{pmatrix} \]
这样\(z\)正方向的顺时针夹角\(\theta\)在\(x’y’\)坐标系下便是x’正方向的逆时针夹角,与数学上惯用的平面直角坐标一致。
将输入的\(zx\)坐标变换为相应\(x’y’\),求出直线交点\( (x’,y’) \),再逆变换得到 \(x\)与\(z\)的值,即是要塞所在的位置。
至于投出两次末影之眼的地点,要使两次夹角相差不能太小,由于两夹角的正切值之差在计算时作为分母出现,若此差值过小,则误差可能非常大。
一般是在投出一次之后,向末影之眼指示方向垂直的方向行动一段距离。但若距离过大,可能导致这两次末影之眼分别定位至不同的要塞,则计算无效。
例如:
站立的坐标为\((x,z)=(-815,-247) \),投出一颗末影之眼,此时方向角为\( 42.6^\circ \)
移动至\( (x,z)=(-746,-55)\),再投一颗末影之眼,得到方向角为\( 52.1^\circ \)
变换至\(x’y’\)坐标下,对应两夹角不变,两点的坐标分别为\((247,-815),(55,-746)\)
则两直线方程分别为
\[ \begin{cases}
y’+815 &=\tan(42.6^\circ)(x’-247) \\
y’+746 &=\tan(52.1^\circ)(x’-55) \\
\end{cases} \]
解得
\[ \begin{cases}x’ & =-617.42 \\ y’ &=-1609.76 \\ \end{cases}\]
从而原坐标系下坐标为
\[ \begin{cases}
x &=y’ &= -1609.76 \\
z & =-x’ & =617.42 \\
\end{cases} \]
验证一下,在拥用权限游戏中使用命令”/locate stronghold”查看最近的要塞位置,结果为
"The nearest stronghold is at [-1608,~,632]"(1102 blocks away)
结果还是比较可观的,跑到算出的坐标下应该不难挖到地牢从而找到要塞。