Vector 在另外两个之间的计算位置
Calculation position of a Vector between two others
我认为我现在的问题与每个人在学校学过的截距定理有关,但那是很久以前的事了,我有点半途而废了。
我的问题:
我在二维 space 中有两个向量,分别称为 v1
和 v2
。
我想知道的是在 v1
和 v2
.
之间的线段上的向量 v3
的坐标
我对 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;
}
实际问题与游戏有关,我想让一个友军单位(v2)跟随玩家(v1),但始终保持特定距离(distance)。
我正在使用 LibGDX,是否有任何库函数可以为我完成这项工作?
我认为您正在尝试进行插值并获得一个矢量,该矢量是 v1 和 v2 的 'mix'。这将在他们之间。 (假设将 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))
然后
v3 = v1 + r(v2-v1)
是您问题的答案。
证明:如果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)
.
的类似计算
我认为我现在的问题与每个人在学校学过的截距定理有关,但那是很久以前的事了,我有点半途而废了。
我的问题:
我在二维 space 中有两个向量,分别称为 v1
和 v2
。
我想知道的是在 v1
和 v2
.
之间的线段上的向量 v3
的坐标
我对 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;
}
实际问题与游戏有关,我想让一个友军单位(v2)跟随玩家(v1),但始终保持特定距离(distance)。
我正在使用 LibGDX,是否有任何库函数可以为我完成这项工作?
我认为您正在尝试进行插值并获得一个矢量,该矢量是 v1 和 v2 的 'mix'。这将在他们之间。 (假设将 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))
然后
v3 = v1 + r(v2-v1)
是您问题的答案。
证明:如果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)
.