帮助解决这个问题?

时间:2010-08-06 13:42:42

标签: c++ c algorithm math

我正在试图弄清楚如何做到这一点。基本上我有A点和B点,我知道它的位置。然后我有点C和点D,我只知道C的坐标。我知道C-D的长度,并且知道C-D必须与A-B平行。如何给出A,B,C和C-D的长度,我通常如何解决?感谢

alt text http://img706.imageshack.us/img706/4494/imgclr.png

6 个答案:

答案 0 :(得分:9)

D = C±(B-A)/ | B-A | * | C-D |

如果B = A,则没有解,因为线AB退化到某一点,并且没有定义线到点的平行线。

<强>解释

(B-A)/ | B-A |是单位长度的方向向量。乘以长度| C-D |得到适当的偏移矢量。

修改:将+更改为+以提供两种解决方案。增加了琐碎的案例B = A.

答案 1 :(得分:3)

这个答案与其他一些答案相似,但我认为更多地解释了数学,并且应该允许你更容易地将它合并到一个程序中。

您可以通过(Ay-By)/(Ax-Bx)找到“已知”行的渐变(其中AyA的y坐标等)。让我们称之为M,因为它完全可以计算。

如果两条线是平行的,那么你可以用同样的方法计算出另一条线的渐变:

渐变= (Cy-Dy)/(Cx-Dx) = M

哪个重新排列为(Cy-Dy) = M*(Cx-Dx)

我们也知道C->D是一个给定的长度(我们称之为L)。所以我们可以说

(Cy-Dy)^2+(Cx-Dx)^2 = L^2

使用我们的梯度方程我们可以替换为:

(M^2+1)(Cx-Dx)^2 = L^2

鉴于我们知道M,L和Dx是什么,我们可以轻松解决这个问题:

Cx = ((L^2)/(M^2+1))^0.5 + Dx

然后我们可以使用此Cx的值以及任一等式(渐变可能最简单)来获取Cy

值得注意的是,最后一个方程有一个平方根,可以是正数或负数,因此您将获得两个可能的Cx值,从而得到Cy的两个可能值。这相当于在D的平行线上移动两个相反的方向。

修改

如评论中所述,如果该行是垂直的(即Ax-Bx = 0),则会失败。你需要特殊情况,但在这种情况下,答案变成了一个简单的例子,只是从Cy的值中增加或减去你的长度。

答案 2 :(得分:1)

介绍向量 v = A - B 。此方向与 C D 之间的方向相同。因此 D = C v ,我们只需要确定λ。 C D 之间的距离已知, d 。但距离是 d = | D - C | = | C v - C | = | λ| v ,其中 v = | v |是 v 的长度。因此| λ| = d / v使得λ=±d / v。

仅供参考,长度| |矢量 u =(x,y)由|给出 |毕达哥拉斯定理得= sqrt(x ^ 2 + y ^ 2)。

答案 3 :(得分:0)

了解A&amp; amp;的位置B,你可以很容易地找到AB线的长度和斜率。

要放置D,您需要知道线CD的长度和斜率。你已经知道了它的长度,因为它们是parellel,所以CD的斜率与AB的斜率相同。

答案 4 :(得分:0)

T(x)是点x

的平移

如果T(a)= c,则T(b)= d

基本上,计算出从a到c所需的运动并将相同的函数应用于b。

编辑虽然从技术上讲,根据您提供给我们的信息,您只能计算d的两个不同位置,而不是一个。知道长度是不够的 - d可能是c的任何一方。

答案 5 :(得分:0)

这里有两个适用的公式。

第一个是斜率(上升超过运行),其中=(Yb-Ya)/(Xb-Xa)以及(Yd-Yc)/(Xd-Xc),因为线段是平行的。

第二个是毕达哥拉斯定理,L ^ 2 =(Xd-Xc)^ 2 +(Yd-Yc)^ 2,其中L是给定的C-D长度。

将斜率表示为m并求解点D的X和Y值的等式得出(我认为)这两个公式:

Xd = Xc +(L ^ 2 /(1 + m ^ 2))^ 0.5

Yd = Yc + m(Xd-Xc)