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

C++ 如何沿距离等于X的两个向量找到点,c++,geometry,C++,Geometry,所以我有一个困扰我的问题,我不知道怎么做: 我有两个向量在一点相交。矢量可以从各种不同的角度输入,如以下两幅图像: 交点也是已知的,它是用叉积计算的,我从中得到了它背后的数学。向量的起点和终点也是已知的 现在我有一条长度为X的直线,我想知道这条直线在这两个向量之间的精确位置。然后通过向量知道这些点的坐标。我认为这幅图更能描述它: 当然,长度为X的直线可以在两个向量之间拟合有许多不同的方式,例如,以下两幅图像显示了向量a和B之间直线X的不同位置,其中直线长度相同,但位置和角度不同: 如果可能

所以我有一个困扰我的问题,我不知道怎么做:

我有两个向量在一点相交。矢量可以从各种不同的角度输入,如以下两幅图像:

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

现在我有一条长度为X的直线,我想知道这条直线在这两个向量之间的精确位置。然后通过向量知道这些点的坐标。我认为这幅图更能描述它:

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

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

找出这条线位置的最佳方法是什么?那么直线在向量A上从哪里开始,在向量B上从哪里结束?我想在C++中实现这一点,但是计算两个向量上的每个点之间的距离,并检查它是否等于x,看起来非常密集,不可能用浮点。< /P> 编辑:找到解决方案。下面我将给出一个小例子

  • 假设角度c(向量A和向量B之间的角度)是90度
  • 比率是1:2(因此B是A的两倍长)
  • 最后C面是30
你要做的是为向量A和B的长度编上数字。我在使用site时发现,无论你是为A和B边填4和8,还是填8和16,或者其他任何1:2的比例,角度A在所有情况下都是一样的,角度B也是一样的。因此,要计算角度a和b,只需使用示例5和10。您首先要做的(或者至少我是这样做的)是使用角度C计算侧面C,并使用以下公式计算侧面A和B:
sqrt(sideA*sideA+sideB*sideB-2*sideA*sideB*cos(度弧度(角度c))。请注意,这不是C面和给定的面,而是用于计算角度的面

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

现在你已经找到了角a,你将得到三角形中的所有角。因为你已经知道了角c,你只计算了a和b=180-a-c。最后一件事是使用角度c计算A侧和B侧,角度A和给定侧c使用以下公式:
sideB*sin(度弧度(角度A))/sin(度弧度(角度B))

当你把它们放在一个函数中作为参数时:(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;`
float fakeSideA=10;
浮动fakeSideB=fakeSideA*ratioB;
浮点数fakeC=sqrt(fakeSideA*fakeSideA+fakeSideB*fakeSideB-2*fakeSideA*fakeSideB*cos(度弧度角c));
浮动角度A=弧度度度(acos((fakeSideB*fakeSideB+fakeC*fakeC-fakeSideA*fakeSideA)/(2*fakeSideB*fakeC));
浮动边a=sideC*sin(度数弧度(角度a))/sin(度数弧度(角度c));
std::cout您可以使用

然后你要做的是注意向量A和向量B的大小之比允许你在图片中从A转换到B。由此可知C,A=180度-C-B

你有六个变量,一个b c,两个约束(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)/Length(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段范围内)


“直线沿向量B的距离应该是5倍”这是什么意思?@Rakete1111 S和直线与向量B接触的位置之间的距离,应该是S和直线与向量A接触的位置之间距离的5倍。我希望这能更好地解释这一点,我会编辑它。这很有意义,谢谢:)你是说你
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...