如何找到距离等于 X 的两个向量的点
Posted
技术标签:
【中文标题】如何找到距离等于 X 的两个向量的点【英文标题】:How to find the points along two vectors where the distance is equal to X 【发布时间】:2016-07-05 22:15:26 【问题描述】:所以我有以下问题让我感到困惑,我不知道该怎么做:
我有两个相交的向量。向量可以来自各种不同的角度,如下两张图:
交点也是已知的,它使用叉积计算,我从this 得到了它背后的数学。向量的起点和终点也是已知的。
现在我有一条长度为 X 的线,我想知道这条线在这两个向量之间的哪个位置完全吻合。然后从向量中知道这些点的坐标。我认为这张图片能更好地描述它:
当然,一条长度为 X 的线可以通过多种不同的方式拟合两个向量,例如以下两张图片显示了向量 A 和 B 之间线 X 的不同位置,其中线的长度相同,但位置和角度不同:
如果可能的话,我希望位置的差异由向量的长度决定。因此,如果向量 B 是向量 A 的 5 倍长,那么 S 到线与向量 B 相接触处的距离应该是 S 到线与向量 A 相接触处距离的 5 倍。如上右图所示S到直线与向量B相接处的距离远大于S到直线与向量A相接处的距离。
找出这条线的位置的最佳方法是什么?那么,线在向量 A 的哪个位置开始,在向量 B 的哪个位置结束?我想在 C++ 中实现这一点,但是计算两个向量上每个点之间的距离并检查这是否等于 X 似乎非常密集,并且对于浮点数是不可能的。
编辑:找到解决方案。下面我举一个小例子。
假设角度 c(矢量 A 和矢量 B 之间的角度)为 90 度。 比率为 1:2(因此 B 是 A 的两倍)。 最后边 C 是 30。您要做的是为向量 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 和边 B,使用以下公式计算角度 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 接触的位置之间的长度,您就可以计算出它的坐标。
【问题讨论】:
"这条线应该是向量 B 的 5 倍" 这是什么意思? @Rakete1111 S 和直线接触向量 B 的距离应该是 S 和直线接触向量 A 的距离的五倍。我希望能更好地解释它,我'将在其中进行编辑。 有道理,谢谢:) 你的意思是你有两条线,或线段在一点相交?向量没有相交的概念。 圈子有用吗?一个圆圈是所有点所在的位置,它们之间的距离是恒定的。 【参考方案1】:您可以使用law of cosines。
Here is an illustration of applying this to your problem.
然后你应该做的是注意向量 A 与向量 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 页面上的相应公式来求解(或者自己从页面上的公式之一推导出来)。
编辑:另请注意,您需要将从这些公式中找到的角度转换/映射到原始方向/坐标系。
【讨论】:
我想我在这里遗漏了一些东西,但我似乎无法将其缩小到一个未知数。我现在有“b^2 = (ratio * b)^2 + c^2 - 2 * (ratio * b) * c * cos(180 - A - C)”。 c 是我知道长度的线,角度 C 是可计算的,给我留下了未知数 b 和 A。不知道如何从这里开始。 你从 a b c A B C 开始。你知道 c 和 C。你现在需要 a b A B。b = a / ratio。 B = 180 - C - A。正如你所说,你现在需要 b 和 A。由于单个公式有两个未知数,这意味着您有可能答案的无限组合。因此,为 b 或 A 选择一个值(我会选择一个具有一定意义的值,但您可以选择一个随机值)并使用它来解决最终的未知数。基本上,由于您有两个未知数和一个公式,您的系统定义不足,您需要定义另一个变量来求解系统。 对不起,我真的不明白。如果我只是填写一个随机值,最终的未知数总是不同的,90% 的时间它甚至无法计算,所以我真的很困惑,因为它不应该不同,对吧? 你能告诉我,如果比率是 2(意味着 b 是 a 的两倍),C 是 90 度,c 是 32,那么这些值是如何计算的? 我们需要在您的示例中找到 b 或 A。为此,我会使用law of sines(尽管我确信还有其他方法)。这表明 c/sinC = b/sinB = a/sinA。您知道 c 和 C。因此,请注意 b=2a,并且 a=sinA *c/sinC。我们现在只需要找到一个未知数:A 的值。当我们找到 A 时,我们将获得 B 的值(即 180-C-A)和 a(之前看到的)和 b(b=2a)的值。诀窍是承认你正在用你的约束做一个三角形。【参考方案2】:让我们给定线段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 * dAEB = 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...
【讨论】:
我认为应该是 EB = S - t * kBA * dB (不是 dA),最后一个等式归结为 t = sqrt(Len^2 / ((kBA * dB.x - dA.x)^2 + (kBA * dB.y - dA.y)^2)) ,如果我没有错过某个步骤... 对于 dB - 是的,复制过去错误。对于最后一个方程 - 是的,一切都是正确的(+- 解是可能的,平行线的除数为零) 这里的未知数比 t 多得多; EA 是两个数字 (x, y) 而不是一个,对于 EB 也是如此;所以你需要把这个细节化,否则它是一个无法解决的系统 @gpasch 你说的不对。t
是唯一的未知数。 EA.X 和 EA.Y 都通过已知坐标和 t 表示
显然你的表述有一些谬误;您建议只有两个位置适合该段;那不是真的;我觉得谬误在于您将归一化的 dA 与未归一化的 S 混合在一起以上是关于如何找到距离等于 X 的两个向量的点的主要内容,如果未能解决你的问题,请参考以下文章