dot_product(x1, y1, x2, y2)
参数 | 描述 |
---|---|
x1 | 第一个向量的x坐标。 |
y1 | 第一个向量的y坐标。 |
x2 | 第二个向量的x坐标。 |
y2 | 第二个向量的y坐标。 |
返回: Real(实数)
点积是一个表示两个向量之间角关系的值,先把两个向量相乘,然后把结果相加得到。名称 "点积" 是从中心点 "·"产生,通常用于指定此操作 (另一个可替代名称 "标量积" 强调标量, 而不是矢量性质的结果)。
数学公式如下:
在二维平面中, a[x1,y1]和b[x2,2] 的点积就是 x1x2 + y1y2,即 dot_product 在 GameMaker Studio 2 的计算公式是:
a · b = (x1*x2)+(y1*y2);
点积的奇怪之处在于它与输入向量形成的角度的关系, 该角度可以表示为:
a · b = (length of a) * (length of b) * cos(angle)
也就是说, 两个向量的点积将等于这些向量之间角度的余弦, 乘以每个向量的长度。这儿有张插图:
有几件事, 我们现在可以发现任何两个向量和它们的点积之间的关系:
这对我们做游戏有什么用呢?嗯, 这种数学关系可以在相当多的情况下使用, 但最好的方式是建立一个实际的场景, 自己看看发生了什么。其中一个最简单的方法是生成一个简单的 "视线" 检查敌人, 比如说, 一个平台跳跃游戏,如果玩家在敌人的矢量法线的两侧90度范围内,那么敌人将“看”到玩家。
基本上, 我们必须敌人的单位向量 (即: 由一个方向和视线距离组成) 然后我们就能得到玩家到敌人的矢量。然后我们将得到这些向量的点积, 如果点积计算结果是正的, 玩家已经被看到, 如果是否定的, 就没有被看到。下面的示例中提供了要完成此工作的实际代码。
var x1, y1, x2, y2;
x1 = lengthdir_x(1, image_angle);
y1 = lengthdir_y(1, image_angle);
x2 = o_Player.x - x;
y2 = o_Player.y - y;
if dot_product(x1, y1, x2, y2) > 0 seen=true else
seen=false;
上面的代码使用实例图像角度创建一个向量, 然后获取玩家对象 "o _ player"的向量 。最后, 它计算这两个向量的点积, 如果它大于 0, 它将变量 "seen" 设置为 true, 如果它等于或小于 0, 它将其设置为 "false "。