gpt4 book ai didi

c++ - 如何找到距离等于 X 的两个 vector 上的点

转载 作者:太空狗 更新时间:2023-10-29 21:15:18 25 4
gpt4 key购买 nike

所以我遇到了以下令我困惑的问题,我不知道该怎么做:

我有两个相交于一点的 vector 。 vector 可以从各种不同的角度进入,如下两张图片:

Example 1 Example 2

交点也是已知的,它是使用叉积计算的,我从 this 得到了它背后的数学原理. vector 的起点和终点也是已知的。

现在我有一条长度为 X 的直线,我想知道这条直线恰好适合这两个 vector 之间的哪个位置。然后从 vector 中知道这些点的坐标。我认为这张图片描述得更好:

Example 3 Example 4

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

Example 3 again Example 5

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

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

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

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

你想要做的是为 vector A 和 B 的长度补上数字。我使用 this 发现的结果现场,是你是否为 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(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 的线与 vector A 接触的位置之间的长度,您可以计算出它的坐标。

最佳答案

您可以使用 law of cosines .

Here is an illustration of applying this to your problem.

然后你应该做的是注意 vector A 与 vector B 的大小之比允许你从图片中的 a 转换为 b。从那里,C 是已知的,A = 180 度 - C - B。

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

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

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

关于c++ - 如何找到距离等于 X 的两个 vector 上的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com