web-dev-qa-db-ja.com

線分セグメントの法線ベクトルを計算するにはどうすればよいですか?

(x1、y1)から(x2、y2)に向かう線分があるとします。線に垂直な法線ベクトルを計算するにはどうすればよいですか?

3Dのプレーンに対してこれを行うことについて多くのことを見つけることができますが、2Dのものはありません。

数学を簡単にしてください(実際の例、図、またはアルゴリズムへのリンクは大歓迎です)、私は数学者よりもプログラマーです;)

162
Piku

dx = x2-x1およびdy = y2-y1を定義すると、法線は(-dy、dx)および(dy、-dx)です。

除算は必要ないため、ゼロで除算するリスクはありません。

216
Oren Trutner

それを考える別の方法は、与えられた方向の単位ベクトルを計算してから、90度の反時計回りの回転を適用して法線ベクトルを取得することです。

一般的な2D変換のマトリックス表現は次のようになります。

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

ここで、(x、y)は元のベクトルの成分であり、(x '、y')は変換された成分です。

T = 90度の場合、cos(90)= 0およびsin(90)=1。それを代入して乗算すると、次のようになります。

x' = -y
y' = +x

前に示したものと同じ結果ですが、それがどこから来たかについてもう少し説明します。

86
duffymo

この質問はずっと前に投稿されましたが、答える別の方法を見つけました。そこでここで共有することにしました。
まず、次のことを知っておく必要があります。2つのベクトルが垂直の場合、それらの内積はゼロになります。
法線ベクトル(x',y')は、(x1,y1)(x2,y2)を結ぶ線に垂直です。この行の方向は(x2-x1,y2-y1)または(dx,dy)です。
そう、

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

上記の式を満たすペア(x '、y')がたくさんあります。しかし、常に満たす最良のペアは(dy,-dx)または(-dy,dx)のいずれかです

11
Tu Bui
m1 = (y2 - y1) / (x2 - x1)

垂直な2本の線の場合:

m1*m2 = -1

それから

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

bは、定義したポイントから渡す場合は何か

7
ufukgun