Java 计算向量在其他两个向量之间的位置

Java 计算向量在其他两个向量之间的位置,java,math,libgdx,Java,Math,Libgdx,我认为我目前的问题与每个人在学校学到的截距定理有关,但那是很久以前的事了,我有点半途而废 我的问题是: 在二维空间中有两个向量,分别是v1和v2 我想知道的是向量v3的坐标,它位于v1和v2之间的线段上 关于v3,我知道的是v1和v3和v2和v3之间的行段长度。 我的思想总是围绕着这个方向旋转,使用v1和v2之间的斜率来确定v3的坐标,但在这一点上我陷入了困境 这是我用于此问题的实际代码: private Vector2 getPointOnLine(Vector2 v1, Vector2 v2

我认为我目前的问题与每个人在学校学到的截距定理有关,但那是很久以前的事了,我有点半途而废

我的问题是: 在二维空间中有两个向量,分别是
v1
v2

我想知道的是向量
v3
的坐标,它位于
v1
v2
之间的线段上
关于v3,我知道的是
v1
v3
v2
v3
之间的行段长度。 我的思想总是围绕着这个方向旋转,使用
v1
v2
之间的斜率来确定
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;
}
actuell问题与游戏有关,我想让盟军单位(v2)跟随玩家(v1),但始终保持特定的距离(距离)


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

我认为您正在尝试插值并获得一个向量,它是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提供的一种线性插值方法,您只需要距离
d(v1,v3)
d(v1,v2)=d(v1,v3)+d(v3,v2)
的比值。让

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

这就是你问题的答案


证明:如果
d(v1,v3)=0
r=0
v3=v1
。如果
d(v3,v2)=0
,则
r=1
v3=v1+v2-v1=v2
v3
的公式是线性的,它同时通过
v1
v2
,因此
v3
始终在这些向量之间的直线上。最后,
norm(v3-v1)=r*norm(v2-v1)=d(v1,v3)
和对
norm(v2-v3)
的类似计算谢谢,我想我需要用它终止一点,因为每次返回的向量都与v1相同。@Aeglasin我想这是因为libGDX向量是可变的,这意味着这段代码实际上会将v1更改为结果!我会将其更改为执行复制,以避免这种情况。如果您确实希望将对象的一个位置设置为新的插值位置,则可以删除副本,并从要更改的向量中使用lerp()方法。
v3 = v1 + r(v2-v1)