繁体   English   中英

如何沿距离等于X的两个向量找到点

[英]How to find the points along two vectors where the distance is equal to X

所以我有以下问题令我困惑,我无法弄清楚如何做到这一点:

我有两个向量相交的向量。 矢量可以来自各种不同的角度,如下面的两个图像:

例1例2

交点也称,其计算使用交叉的产品,我从拿到了数学背后 矢量的起点和终点都是已知的。

现在我有一条长度为X的线,我想知道这两条线在这两条线之间的确切位置。 然后从向量中了解那些点的坐标。 我认为这张图片更好地描述了它:

例3例4

当然,长度为X的线可以在两个矢量之间有许多不同的方式,例如,下面的两个图像显示了矢量A和B之间的线X的不同位置,其中线的长度相同但位置和角度不同:

再次举例3例5

如果可能,我希望位置的差异由向量的长度决定。 因此,如果矢量B是矢量A的五倍,则S与线接触矢量B的位置之间的距离应该是S与线接触矢量A的距离的5倍。如右上图所示S与线接触矢量B的位置之间的距离远大于S与线接触矢量A的位置之间的距离。

找出这条线的位置的最佳方法是什么? 那么在矢量A上的线开始,矢量B的位置结束了? 我想在C ++中实现这一点,但计算两个Vector上每个点之间的距离,并检查是否等于X似乎非常密集,并且不可能使用浮点数。

编辑:找到解决方案。 下面我将举一个小例子。

  • 假设角度c(矢量A和矢量B之间的角度)是90度。
  • 比例为1:2(因此B是A的两倍)。
  • 最后C方是30。

你想要做的是为矢量A和B的长度组成数字。我使用这个网站发现的是,你在4和8中填写A和B,或8和16或其他任何1 :2比率,角度a在所有情况下都是相同的,角度b也是如此。 因此,计算角度a和b只是用于例如5和10.您首先要做的是(或至少我这样做)是使用以下公式使用角度c和A侧和B侧计算C侧: sqrt(sideA * sideA + sideB * sideB - 2 * sideA * sideB * cos(degreesToRadian(angleC))); 请注意,这不是同一侧C和给定的一侧,而只是用于计算角度的一侧。

之后,您可以使用以下公式计算角度a: radianToDegrees(acos((sideB * sideB + sideC * sideC - sideA * sideA) / (2 * sideB * sideC)))

现在您已找到角度a,您将在三角形中拥有所有角度。 因为你已经知道了角度c,你只计算了a和b = 180 - a - c。 最后要做的是使用角度c,角度a和给定边C使用以下公式计算A侧和B侧: sideB * sin(degreesToRadian(angleA)) / sin(degreesToRadian(angleB))

当你把所有这些放在一个函数中时,它接受参数:(float angleC,float ratioB,float sideC)。 在我们的情况下是(90,0.5,30)。 然后计算如下:

    float fakeSideA = 10;
    float fakeSideB = fakeSideA * ratioB;
    float fakeC = sqrt(fakeSideA * fakeSideA + fakeSideB * fakeSideB - 2 * fakeSideA * fakeSideB * cos(degreesToRadian(angleC)));

    float angleA = radianToDegrees(acos((fakeSideB * fakeSideB + fakeC * fakeC - fakeSideA * fakeSideA) / (2 * fakeSideB * fakeC)));
    float sideA = sideC * sin(degreesToRadian(angleA)) / sin(degreesToRadian(angleC));

    std::cout << "SideA: " << sideA << ", AngleA: " << angleA << ", SideC: " << sideC << ", AngleC: " << angleC << std::endl;`

输出应如下: SideA: 26.8328, AngleA: 63.435, SideC: 30, AngleC: 90 哪个是对的。 知道sideA是S与长度X的线接触矢量A的位置之间的长度,你可以计算出它的坐标。

你可以使用余弦定律

以下是将此问题应用于您的问题的说明。

你应该做的是注意矢量A和矢量B的大小比例允许你在图片中从a转换为b。 从那里,C是已知的,A = 180度 - C - B.

你有六个变量,abc ABC,两个约束(A = 180 - C - B和a = ratio * b),以及C形式的常量。

您现在可以为a或b,A或B或c中的三个中的两个选择值。 使用正弦定律将此变量等同于其各自的伙伴。 这样做会留下一个未知的,你可以使用wolfram页面上的相应公式来解决(或者只是从页面上的一个公式中获取它)。

编辑:另请注意,您需要将从这些公式中找到的角度转换/映射到原始方向/坐标系。

让我们给出段A,段B,交叉点S.
找到A和B的归一化方向向量(可能在计算交点时已经找到它们)

dA =(A1.X - A0.X,A1.Y - A0.Y)/长度( A
dB =(B1.X - B0.X,B1.Y - B0.Y)/长度( B

和比率kBA

kBA =长度( B )/长度( A

位于B上的新段的结束应该是距离S更远的kBA时间

EA = S - t * dA
EB = S - t * kBA * dB

现在写出EA-EB段长度的等式,

 LenX^2 = (EA.X - EB.X)^2 + (EA.Y - EB.Y)^2

解决未知参数t,找到点EA和EB(如果存在解,它们确实存在于A和B段的范围内)

Denom = (kBA * dB.x - dA.x)^2 + (kBA * dB.y - dA.y)^2
if Denom = 0 then segments are parallel and there is no solution
else
t = +/- sqrt(Len^2 / Denom) 

finally 
EA.X = S.X - t * dA.X
and so on...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM