如何找到距离等于X

时间:2016-07-05 22:15:26

标签: c++ geometry

所以我遇到了令我困惑的以下问题,我无法弄明白该怎么做:

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

Example 1 Example 2

交叉点也是已知的,它是使用交叉乘积计算的,我从this得到了它背后的数学。矢量的起点和终点都是已知的。

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

Example 3 Example 4

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

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

之后,您可以使用以下公式计算角度α: 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的位置,你可以计算出它的坐标。

2 个答案:

答案 0 :(得分:2)

您可以使用law of cosines

Here is an illustration of applying this to your problem.

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

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

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

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

答案 1 :(得分:1)

给出段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...