dot_product

点积是一个表示两个向量之间角度关系的值,它是通过取两个向量,将它们相乘,然后将结果相加得到的。“点积”这个名称来源于通常用于指定此操作的居中点“·”(另一个名称“标量积”强调结果的标量性质而不是向量性质)。

实际的数学公式可以写成这样:

Dot Product formula

因此,在2D中,向量a[x1,y1]b[x2,2]的点积是x1x2 + y1y2,这意味着GameMaker中的点积计算为:

a · b = (x1*x2)+(y1*y2);

点积的奇妙之处在于它与输入向量形成的角度之间的关系,可以表示为:

a · b = (length of a) * (length of b) * cos(angle)

也就是说,两个向量的点积等于这两个向量夹角的余弦,乘以它们各自的长度。这里有一张图片来说明:

Dot Product ilustration

注意:有关向量的更多信息,请参见这里的

我们现在可以从任意两个向量与它们点积的结果的关系中得出一些结论:

这对我们这些游戏开发者来说意味着什么呢?这种数学关系可以用在很多情况下,但最好的方法是建立一个实际的场景,自己看看发生了什么。最简单的方法之一是,在平台游戏中为敌人生成一个简单的“视线”检查,这样敌人就会“看到”玩家,如果他们在向量法线两边的90°内。

Dot product example基本上,我们必须获得敌人的法向量(即包含方向和视线距离),然后我们需要获得玩家到敌人的向量。然后我们将得到这些向量的点积,如果结果是正的,则表示玩家被看过,如果结果是负的,则表示他没有看过。下面的示例中提供了实现此函数的实际代码。

 

语法:

dot_product(x1, y1, x2, y2)

参数类型描述
x1Real第一个向量的 x 坐标。
y1Real第一个向量的 y 坐标。
x2Real第二个向量的 x 坐标。
y2Real第二个向量的 y 坐标。

 

返回:

Real

 

例子:

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”。