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


177

(x1、y1)から(x2、y2)へのラインセグメントがあるとします。線に垂直な法線ベクトルを計算するにはどうすればよいですか?

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

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


2
この背後にある「数学」について知りたい場合は、stackoverflow.com / a / 7470098/189767で私の答えを検索できます。基本的には同じですが、より複雑です。
Andreas

2
この質問は、プログラミングではなく数学についてです。
チャーリー

1
この質問はプログラミングではなく数学に関するものであるため、トピック外として締めくくります。
2015年

回答:


237

dx = x2-x1とdy = y2-y1を定義すると、法線は(-dy、dx)と(dy、-dx)になります。

除算は必要ないため、ゼロで除算するリスクがないことに注意してください。


14
それは非常に微妙で、normal.x = -dyおよびnormal.y = dxを実現するのにしばらく時間がかかりました。xの部分をyの値に割り当てるタイプミスのように見えたので、逆の方法でそれらを使用しました...
Piku

@OrenTrutner私はまだこれを理解していません。(x', y') = (-y, x)そして(x', y') = (y, -x)、右のようですが、なぜ1が使用するであろうdxdyここに。さらに、傾きに基づいて、m1 * m2 = -1直角線の場合、それゆえdy' = dx' * (-dx/dy)、そしてdx' = dy' * (-dy/dx)、あなたの方程式はnormal.x = x' = -dyどうですか?
legends2k 2013年

1
ここでデルタがどのように役割を果たすかについて、もう少し簡単に説明していただけますか?私はここで何かを逃していると確信しています。
legends2k 2013年

7
@ legends2k:デルタは接線ベクトルです。法線は、接線に垂直な方向です。90度回転の2Dマトリックスを見ると、x / y値を反転して1つを否定することが明らかになります。en.wikipedia.org/ wiki / Rotation_matrix#Basic_rotations
geon

@geon:ああ!わかった、私はデルタと勾配を混同していたが、アフィンジオメトリでは2点間の差はベクトルであり、ここではタンジェである:)
legends2k

95

それを考えるもう1つの方法は、特定の方向の単位ベクトルを計算してから、反時計回りに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

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


2
おかげで、それがどのようにして派生しているかについて頭を悩ませていました。
legends2k 2013年

1
私は以前に回転の公式を知っていましたが、この回答で頭の中でクリックしたのは、角度が一定(+/- 90)であることで、これにより、xとyの単純な否定と反転が単純化されました。
legends2k 2013年

@duffymo結果の長さは1ですか?
Martin Meeser 14

ベクトルが変換前に正規化された場合、変換後もそのままになります。回転変換の前または後に正規化する必要があります。
duffymo 2014

11

この質問はずっと前に投稿されましたが、それに答える別の方法を見つけました。ここでそれを共有することにしました。
まず、1つ知っておく必要があります。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)


7
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は、定義したポイントから渡したい場合に使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.