我有一个令我感到困惑的问题,涉及编程。我有两个向量在某一点相交。这些向量可能来自不同的角度,就像以下两幅图像所示:
当然,一条长度为X的直线可以以多种不同的方式适配两个向量。例如,下面的两幅图像展示了线X在向量A和B之间的不同位置,其中线的长度相同,但位置和角度不同:
最好的方法是找到这条直线的位置在哪里?所以线在向量A上的起点和在向量B上的终点在哪里?我想在C++中实现这个,但计算两个向量上每个点之间的距离并检查是否相等似乎非常耗费时间,并且使用浮点数也很困难。
编辑:解决方案已找到。下面我将给出一个小例子。
- 假设角度c(向量A和向量B之间的夹角)为90度。
- 比例为1:2(因此B的长度是A的两倍)。
- 最后,C边长为30。
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。最后一件事是使用以下公式计算边 A 和边 B,使用角度 c、角度 a 和给定的边 C: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相交的点之间的长度,您可以计算出那个点的坐标。