2011-07-10 42 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真正想要什麼)。 –