从一道题开始讲起:给你一个任意点,让你判断这个点在不在这个扫描器范围内。
v.dir = function() {return Math.atan2(this.y, this.x)}
没错,这道题我们可以使用向量的方向来解。因为这里的 dir 是由向量与 x 轴夹角决定的,所以判断点是否在扫描器范围内,我们只需要计算点坐标对应的向量的 dir 值,是否在扫描器的范围内就可以了。代码如下:
const isInRange = v0.dir > Math.PI / 3 && v0.dir < 2 * Math.PI / 3
这是一个很简单、直观的解法,但是它不够完美,因为这个判断和扫描器的方向有关。什么意思呢?从上面的图中你可以看到,现在它正对着 y 轴正方向,所以角度在 π/3 和 2π/3 之间。但如果将它的方向旋转,或者允许它朝向任意的方向,我们就必须要修改对应的角度值了。这个时候就会非常麻烦。
因此,我们会使用一个更通用的解法,也就是利用向量的乘法来解。那具体怎么做呢?别着急,我先带你来复习一下我们高中学过的向量乘法的知识,如果你记得不是特别清楚,正好可以借着这个机会来加深印象。
我们知道,向量乘法有两种,一种是点乘&