Çizgi parçasının normal vektörünü nasıl hesaplayabilirim?


177

Diyelim ki (x1, y1) 'den (x2, y2)' ye giden bir çizgi segmentim var. Çizgiye dik olan normal vektörü nasıl hesaplayabilirim?

Bunu 3D uçaklar için yapmayla ilgili birçok şey bulabilirim, ancak 2D şeyler yok.

Lütfen matematikte kolay gidin (çalışılan örneklere, diyagramlara veya algoritmalara bağlantılar hoş geldiniz), bir matematikçiden daha fazla programcıyım;)


2
Ve bunun arkasındaki "matematik" hakkında bilgi edinmek istiyorsanız cevabımı stackoverflow.com/a/7470098/189767 adresinden arayabilirsiniz . Temel olarak aynı, ancak daha ayrıntılı.
Andreas

2
Bu soru programlama ile değil matematikle ilgilidir.
Charlie

1
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü bu programlama ile değil matematikle ilgili.
Pang

Yanıtlar:


237

dx = x2-x1 ve dy = y2-y1 tanımlarsak, normaller (-dy, dx) ve (dy, -dx) olur.

Bölme işleminin gerekli olmadığını ve bu nedenle sıfıra bölme riskiniz olmadığını unutmayın.


14
Oldukça ince ve normal.x = -dy ve normal.y = dx'i fark etmem biraz zaman aldı. Onları başka yönden aldım çünkü x kısmını y değerine atayan bir yazım hatası gibi görünüyordu ...
Piku

@OrenTrutner Bunu hala anlamıyorum; (x', y') = (-y, x)ve (x', y') = (y, -x)doğru gibi gözüküyor, ama neden burada dxve dyburada kullanılır? Dahası, eğimlere dayanarak, m1 * m2 = -1dik açılı çizgiler için, dy' = dx' * (-dx/dy)ve dx' = dy' * (-dy/dx)denkleminize nasıl gelirsiniz normal.x = x' = -dy?
legends2k

1
Deltanın burada nasıl bir rol oynadığı hakkında daha fazla bilgi verebilir misiniz? Eminim burada bir şey eksik.
legends2k

7
@ legends2k: Delta teğet vektördür. Normal, tanjantın dikey yönüdür. 90 derece döndürme için bir 2D matrisine bakarsanız x / y değerlerini çevirmek ve birini reddetmek belirginleşir: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@ geon: Aah! Anladım, afin geometride iken deltayı eğimle karıştırıyordum, iki nokta arasındaki fark bir vektör, buradaki tanget :)
legends2k

95

Bunu düşünmenin bir başka yolu, birim vektörü belirli bir yön için hesaplamak ve daha sonra normal vektörü elde etmek için saat yönünün tersine 90 derece döndürmektir.

Genel 2D dönüşümünün matris temsili şöyle görünür:

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

burada (x, y) orijinal vektörün bileşenleridir ve (x ', y') dönüştürülmüş bileşenlerdir.

T = 90 derece ise, cos (90) = 0 ve sin (90) = 1 ise. Değiştirme ve çarpma şunları sağlar:

x' = -y
y' = +x

Daha önce verilenle aynı sonuç, ancak nereden geldiğiyle ilgili biraz daha açıklama ile.


2
Bir ton teşekkürler, nasıl türetildiği konusunda kafamı kırıyordu.
legends2k

1
Daha önce rotasyon formülünü bilsem de, kafamın içine tıklayan şey, bu cevapla, açının sabit (+/- 90) olması ve bunu x ve y'nin basit bir olumsuzlaması ve tersine çevirmesini basitleştirmesiydi.
legends2k

@duffymo sonucunun uzunluğu bir mi?
Martin Meeser

Vektör, dönüşümden önce normalize edilirse, daha sonra böyle kalacaktır. Dönme dönüşümünü yapmadan önce veya sonra normalleştirmeniz gerekir.
duffymo

11

Bu soru uzun zaman önce gönderildi, ancak cevaplamak için alternatif bir yol buldum. Ben de burada paylaşmaya karar verdim.
İlk olarak, şunu bilmeliyiz: eğer iki vektör dik ise, nokta ürünleri sıfıra eşittir.
Normal vektör (x',y'), (x1,y1)ve ile bağlanan çizgiye diktir (x2,y2). Bu çizginin yönü vardır (x2-x1,y2-y1)veya (dx,dy).
Yani,

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

Yukarıdaki denklemi sağlayan çok sayıda çift (x ', y') vardır. Ama HER ZAMAN tatmin ettiği en iyi çift (dy,-dx)ya(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

dikey iki çizgi varsa:

m1*m2 = -1

sonra

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.. 

Eğer tanımladığınız bir noktadan geçmek istiyorsanız b bir şeydir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.