从给定的点和角度找到矢量幅值的最便宜方法

时间:2019-08-18 13:26:42

标签: unity3d linear-algebra

我正在尝试确定玩家在平面上的深度位置,该位置定义了2D格斗游戏中的可行走地面。下图描述了该问题:

enter image description here

C代表玩家当前位置。我需要找到向量V的大小。由于我不擅长线性代数,所以我想到的一件事是:确定L1和L2的交点P,然后从AP中获取大小。但是,我觉得必须找到一种更简单的方法来找到V,因为我已经知道矢量应该具有的角度,该角度由AB的矢量给出。

任何输入都会受到赞赏,因为我期待着加强线性代数游戏。

编辑:由于我缺乏绘图能力,目前尚不清楚:上面描述的几何形状是平行四边形。我正在寻找的向量V平行于平行四边形的左侧和右侧。深度并不意味着我在寻找垂直于顶面的向量,而是指纯2D游戏的虚假深度。因此,平行四边形可用作创造沿z轴行走的感觉的方法。

2 个答案:

答案 0 :(得分:1)

我们将其称为平行四边形D的右下顶点。 如果平行四边形的长边是水平的,则可以通过以下方法找到V向量的大小:

V.magnitude =  (c.y - a.y) / sin(BAD)

或者,如果您愿意:

V.magnitude = AB.magnitude * (c.y - a.y)/(b.y - a.y)

答案 1 :(得分:1)

从图形顶行开始测量的播放器深度(V的长度)仅仅是A.y和C.y之间的差。这与平行四边形图中的倾斜是分开的,因为我们只是在查看深度。

示例:

float v; 

Vector2 a = new Vector2(100, 100); //The point you're measuring from
Vector2 c = new Vector2(150, 150); //Your character position

v = c.y - a.y; // This is the length of V.
//In numbers: 50 = 150 - 100 

说明:图像无法缩放 getting the "depth" of a vector 这适用于您飞机上的任何协调员。

现在,如果您想获得AC的长度,则是需要使用一些毕达哥拉斯的时间,即a²+b²=c²。在示例中,这意味着代码:

Vector2 a = new Vector2(100, 100);
Vector2 c = new Vector2(150, 150);

float ac1 = Mathf.Sqrt(Mathf.Pow(c.x - a.x, 2) + Mathf.Pow(c.y - a.y, 2));

现在每次都要键入很麻烦,而且看起来也很恐怖。但是Unity覆盖了您!有一个向量方法called Distance

float ac2 = Vector2.Distance(a, c);

两者都返回70.71068,即AC的长度。 之所以起作用,是因为对于您所在区域的任何点c,您都可以从ac绘制一个直角三角形。

根据评论编辑: 如果您希望“深度”向量与平行四边形的边平行,我们可以在平行四边形中创建一个三角形,然后计算斜边。

由于我们希望三角形的新斜边平行于平行四边形,因此我们可以使用与图形中B点相同的角度θ(我的粉红色表示),我知道您知道其中的值。 / p>

我们也知道这个新三角形的相邻边(用蓝色表示)的长度,因为这是我们之前计算的高度(c.y-a.y)。

使用这两个值,我们可以使用余弦找到与平行四边形平行的三角形的斜边(用红色表示)的长度,该长度等于矢量V。 其公式为:hypotenuse = adjacent/cos(θ)

现在,如果我们要在其中输入一些数字,对于我的示例,我取55度作为角度θ。看起来像这样

float v = 50/(cos(55));

图像无法缩放

Getitng the hypotenuse of a triange using cosine