2011-07-10 43 views
-2

我想找到垂直于给定线的点z(x3,y3)。在我的例子中,我给出了2个坐标A(x1,y1)和B(x2,y2)。我想找到从点B垂直(AZ)到AB线和距离(h)的点z。ABZ角度是90. 这里是我的C++代码。找到垂直于给定线的点

double AB_slope = m; // know it

//找到ž点是垂直于AB线

double AZ_slope = - 1/m;

double x3 = x2 + prescribed_distance * dx;

double y3 = y2 + prescribed_distance * dy;

但我不知道找DX,DY和prescribed_distance。请帮帮我。

+3

点不能垂直于一条线。 – Gedrox

+1

这是一个数学问题,问问http://math.stackexchange.com/ –

+0

问题条件是否包含'h'值,或者您只想找到经过'A'且正交于'AB'? –

回答

5

让我把你的问题改为我的想法,然后回答它。

给予积分A = (x1, y1)B = (x2, y2)。你想找到一个点Z = (x3, y3),使得​​垂直于AB,而BZ的长度为h

AB的载体是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)h远离B

从勾股定理,长度从F(s)B平方总是将成为距离的平方从F(s)A,加上距离的从AB平方。从中我们得到了我们想要的凌乱的表达式:

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) 

现在它插入表达式sF(s) = (x1 + s*(y2 - y1), y1 + s*(x1 - x2)),你有你的观点Z。另一个可能的答案是另一边的距离相同。

+0

有一些距离B(假设现实h> AB)的点的数量是无限的,并且可以通过A画出一条垂直于AB的直线。事实上,所有这些点的集合描述了一个以A为中心的圆。 –

+0

@兰斯罗伯茨在3个维度中,这些点的集合将描述一个圆。在四维中它将形成一个球体。但是给出的代码是2维的,然后你会得到2分。我给出的技术发现了这些观点。 – btilly

+0

好吧,在2D中肯定,+1。 (尽管我们可能永远不知道OP真正想要什么)。 –