-2

我想找到一个垂直于给定线的点 z(x3,y3)。在我的示例中,我得到了 2 个坐标 A(x1, y1) 和 B(x2, y2)。我想找到垂直(AZ)到 AB 线和距离 B 点的距离(h)的点 z。ABZ 角为 90。这是我的 c++ 代码。

double AB_slope = m; // know it

//找到垂直于AB线的z点

double AZ_slope = - 1/m;

double x3 = x2 + prescribed_distance * dx;

double y3 = y2 + prescribed_distance * dy;

但我不知道找到 dx 、 dy 和规定的距离。请帮我。

4

1 回答 1

5

让我把你的问题改写成我认为的那样,然后回答它。

你得到积分A = (x1, y1)B = (x2, y2)。你想找到一个垂直于并且Z = (x3, y3)有长度的点。AZABBZh

A从到的向量Bv = (x2 - x1, y2 - y1)。一个易于计算的垂直向量是w = (y2 - y1, x1 - x2)A与之垂直的相交线用实数上的范围表示AB。所以我们需要选择一个远离的值。F(s) = A + s*w = (x1 + s*(y2 - y1), y1 + s*(x1 - x2))ssF(s)hB

根据勾股定理,从F(s)到的长度的平方B始终是从 到 的距离的平方加上从F(s)到的距离的平方。从中我们得到我们想要的凌乱表达式:AAB

h**2 = s**2 * ((y2 - y1)**2 + (x1-x2)**2) + ((x1 - x2)**2 + (y1 - y2)**2))
     = s**2 * ((x1 - x2)**2 + (y1 - y2)**2)) + ((x1 - x2)**2 + (y1 - y2)**2))
     = (s**2 + 1) * ((x1 - x2)**2 + (y1 - y2)**2))

(s**2 + 1) = h**2 / ((x1 - x2)**2 + (y1 - y2)**2))

s**2  = h**2 / ((x1 - x2)**2 + (y1 - y2)**2)) - 1

s = sqrt(h**2 / ((x1 - x2)**2 + (y1 - y2)**2)) - 1)

现在将该表达式s重新插入F(s) = (x1 + s*(y2 - y1), y1 + s*(x1 - x2)),您就明白了Z。另一个可能的答案是另一边的距离相同。

于 2011-07-10T21:02:35.270 回答