Vector之间的Vector计算位置

时间:2015-06-09 16:36:24

标签: java math libgdx

我认为我目前的问题与每个人在学校都学到的拦截定理有关,但那是很久以前的事了,我有点被困在中途。

我的问题:

我在一个名为v1v2的二维空间中有两个向量 我想知道的是v3v1之间的线段上的向量v2的坐标。
我对v3的了解是v1v3以及v2v3之间的行划分长度。 我虽然总是围着使用v1v2之间的斜率来确定v3的坐标,但此时我已经卡住了。

这是我用于问题的实际代码:

private Vector2 getPointOnLine(Vector2 v1, Vector2 v2, float distance) throws Exception
{
    double lengthOfSegment=Math.floor(Math.pow(v2.x - v1.x, 2)+Math.pow(v2.y-v1.y,2));

    Vector2 slopeXY=v2.sub(v1);
    float slope=1/slopeXY.x;
    slopeXY.x=slopeXY.x*slope;
    slopeXY.y=slopeXY.y*slope;
}

练拳问题与游戏有关,我想让联盟单位(v2)跟随玩家(v1),但始终保持特定距离(距离)。

我正在使用LibGDX,是否有任何可以为我工作的库函数?

2 个答案:

答案 0 :(得分:1)

我认为你正在尝试插入并获得一个混合的矢量' v1和v2。这将是他们之间的界限。 (假设v1和v2被视为位置向量) 您可以通过对向量进行加权平均来实现此目的,但如果距离是以绝对值而非相对值给出的,那么您将需要转换:

实际上,事实证明libGDX向量可以为你做到这一点!:

private Vector2 getPointOnLine(Vector2 v1, Vector2 v2, float distance) 
{
    double length = Math.hypot(v1.x - v2.x, v1.y - v2.y);
    distance /= length;
    return v1.cpy().lerp(v2, distance);

}

Vector2.lerp是libGDX提供的线性插值方法

答案 1 :(得分:0)

您所需要的只是距离d(v1,v3)d(v1,v2) = d(v1,v3) + d(v3,v2)的比率。让

r = d(v1,v3)/(d(v1,v3) + d(v3,v2))

然后

v3 = v1 + r(v2-v1)

是您问题的答案。

证明:如果d(v1,v3)=0r=0v3=v1。如果是d(v3,v2)=0,那么r=1v3 = v1+v2-v1 = v2v3的公式是线性的,它通过v1v2,因此v3始终位于这些向量之间的线上。最后,norm(v3-v1) = r * norm(v2-v1) = d(v1,v3)norm(v2-v3)的类似计算。