Bagaimana cara menghitung vektor normal segmen garis?

177

Misalkan saya memiliki segmen garis dari (x1, y1) ke (x2, y2). Bagaimana cara menghitung vektor normal tegak lurus terhadap garis?

Saya dapat menemukan banyak hal tentang melakukan ini untuk pesawat dalam 3D, tetapi tidak ada hal-hal 2D.

Silakan menggunakan matematika (tautan ke contoh, diagram, atau algoritme yang bekerja dengan baik), saya seorang programmer lebih dari saya seorang ahli matematika;)

Piku
sumber
2
Dan jika Anda ingin tahu tentang "matematika" di balik ini, Anda dapat melihat jawaban saya di stackoverflow.com/a/7470098/189767 . Pada dasarnya sama, tetapi lebih rumit.
Andreas
2
Pertanyaan ini tentang matematika, bukan pemrograman.
Charlie
1
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena ini tentang matematika, bukan pemrograman.
Pang

Jawaban:

237

jika kita mendefinisikan dx = x2-x1 dan dy = y2-y1, maka normalnya adalah (-dy, dx) dan (dy, -dx).

Perhatikan bahwa tidak ada pembagian yang diperlukan, jadi Anda tidak mengambil risiko pembagian dengan nol.

Oren Trutner
sumber
14
Cukup halus dan butuh beberapa saat untuk menyadari normal.x = -dy dan normal.y = dx. Aku punya mereka sebaliknya karena itu tampak seperti salah ketik menempatkan x bagian dengan nilai y ...
Piku
@ OrenTrutner Saya masih tidak mengerti ini; (x', y') = (-y, x)dan (x', y') = (y, -x)tampaknya benar, tetapi mengapa orang menggunakan dxdan di dysini. Selain itu, berdasarkan pada kemiringan, m1 * m2 = -1untuk garis sudut kanan, maka dy' = dx' * (-dx/dy)dan dx' = dy' * (-dy/dx), bagaimana persamaan Anda normal.x = x' = -dy?
legends2k
1
Bisakah Anda memberi penjelasan lebih lanjut tentang bagaimana delta berperan di sini? Saya yakin saya kehilangan sesuatu di sini.
legends2k
7
@ legends2k: delta adalah vektor singgung. Normal adalah arah yang tegak lurus terhadap garis singgung. Membalikkan nilai x / y dan meniadakannya menjadi jelas jika Anda melihat matriks 2D untuk rotasi 90 derajat: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon
@geon: Aah! Mengerti, saya membingungkan delta dengan kemiringan sementara dalam geometri affine perbedaan antara dua titik adalah vektor, tanget di sini :)
legends2k
95

Cara lain untuk memikirkannya adalah menghitung satuan vektor untuk arah yang diberikan dan kemudian menerapkan rotasi 90 derajat berlawanan arah jarum jam untuk mendapatkan vektor normal.

Representasi matriks dari transformasi 2D umum terlihat seperti ini:

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

di mana (x, y) adalah komponen dari vektor asli dan (x ', y') adalah komponen yang diubah.

Jika t = 90 derajat, maka cos (90) = 0 dan sin (90) = 1. Mengganti dan mengalikannya memberi:

x' = -y
y' = +x

Hasil yang sama seperti yang diberikan sebelumnya, tetapi dengan sedikit penjelasan tentang dari mana asalnya.

Duffymo
sumber
2
Terima kasih banyak, mematahkan kepalaku tentang bagaimana itu diperoleh.
legends2k
1
Meskipun saya tahu rumus rotasi sebelumnya, hal yang mengklik di dalam kepala saya, dengan jawaban ini, adalah bahwa sudutnya adalah konstan (+/- 90), yang menyederhanakannya menjadi negasi sederhana dan pembalikan x dan y.
legends2k
@duffymo apakah hasilnya memiliki panjang satu?
Martin Meeser
Jika vektor dinormalisasi sebelum transformasi itu akan tetap demikian setelah. Anda harus menormalkan baik sebelum atau setelah Anda melakukan transformasi rotasi.
duffymo
11

Pertanyaan ini telah diposting sejak lama, tetapi saya menemukan cara alternatif untuk menjawabnya. Jadi saya memutuskan untuk membagikannya di sini.
Pertama, kita harus tahu bahwa: jika dua vektor tegak lurus, produk titiknya sama dengan nol.
Vektor normal (x',y')tegak lurus terhadap garis yang menghubungkan (x1,y1)dan (x2,y2). Baris ini memiliki arah (x2-x1,y2-y1), atau (dx,dy).
Begitu,

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

Banyak pasangan (x ', y') yang memenuhi persamaan di atas. Tetapi pasangan terbaik yang SELALU memuaskan adalah salah satu (dy,-dx)atau(-dy,dx)

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

jika dua garis tegak lurus:

m1*m2 = -1

kemudian

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 adalah sesuatu jika Anda ingin meneruskannya dari titik yang Anda tentukan

ufukgun
sumber