我想找到一个垂直于给定直线的点z(x3,y3)。在我的例子中,我有两个坐标A(x1, y1)和B(x2, y2)我想求出与AB直线垂直的点z和到点b的距离h, 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和prescribed_distance。
让我把你的问题改写成我的想法,然后回答。
你得到A = (x1, y1)
和B = (x2, y2)
点。你想找到一个点Z = (x3, y3)
,使AZ
垂直于AB
,并且BZ
的长度为h
。
从A
到B
的向量是v = (x2 - x1, y2 - y1)
。一个容易计算的垂直向量是w = (y2 - y1, x1 - x2)
。与AB
垂直的穿过A
的线用F(s) = A + s*w = (x1 + s*(y2 - y1), y1 + s*(x1 - x2))
表示,因为s
在实数范围内。因此,我们需要选择一个值s
,使F(s)
与B
的距离为h
。
根据毕达哥拉斯定理,从F(s)
到B
的长度的平方总是等于从F(s)
到A
的距离的平方加上从A
到B
的距离的平方。从中我们得到我们想要的混乱表达式:
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
。另一个可能的答案是在另一边相同的距离