2011-07-10 22 views
-2

与えられた線に垂直な点z(x3、y3)を見つけたいと思う。私の例では、2つの座標A(x1、y1)とB(x2、y2)が与えられています。 AB線と垂直(AZ)の点z、点Bからの距離(h)を求めます。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を見つけることがわからないのzポイントを見つけると、規定された距離。私を助けてください。

+3

点は線に垂直ではありません。 – Gedrox

+1

これは数学の質問です。http://math.stackexchange.com/ –

+0

に質問してください。問題の条件に 'h 'の値が含まれているのですか、' A'を通って直交する線の任意の点を探したいだけです'AB'? –

答えて

5

あなたの質問を言い換えると、それは私の考えであると言い換えることができます。

ポイントA = (x1, y1)B = (x2, y2)が付与されました。​​がABに垂直であり、BZが長さがhであるような点Z = (x3, y3)を探したいとします。

AからBまでのベクターは、v = (x2 - x1, y2 - y1)である。そのベクトルへの垂直ベクトルの計算は簡単ですw = (y2 - y1, x1 - x2)です。 Aを横切る線は、ABに垂直であり、F(s) = A + s*w = (x1 + s*(y2 - y1), y1 + s*(x1 - x2))と表され、sの範囲は実数を超える。だから、F(s)がから離れてhであるような値sを選ぶ必要があります。

ピタゴラスの定理から、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) 

を今すぐバックF(s) = (x1 + s*(y2 - y1), y1 + s*(x1 - x2))sのためにその表現をプラグインして、あなたはあなたのポイントZを持っています。他の可能な答えは、反対側の同じ距離です。

+0

Bから離れている点が無限にあります(現実的なh> ABと仮定します)。そして、線はAを介してABに対して垂直に描くことができます。実際には、これらすべての点の集合はAを中心とする円を表します。 –

+0

@ Lance Roberts 3次元では、そのような点のセットは円を描くでしょう。 4次元では、球を形成します。しかし、与えられたコードは2次元であったので、2ポイントを得るでしょう。私が与えたテクニックは、それらのポイントを見つけます。 – btilly

+0

OK、2Dでは確かに+1。 (私たちはOPが本当に望んでいることを決して知らないかもしれませんが)。 –

関連する問題