Temukan vektor satuan tepat di antara dua segmen garis yang terhubung


8

Sepertinya pertanyaan yang cepat dan mudah tetapi saya belum dapat menemukan apa yang saya cari:

Bagaimana cara menghitung vektor panjang satuan yang menunjuk sepanjang garis yang persis 50% dari sudut dua segmen garis yang terhubung?

Sebuah gambar berbicara ribuan kata (yang juga lebih baik daripada penjelasan saya!) Contoh vektor satuan yang membagi dua segmen garis yang terhubung
Jadi pada dasarnya saya ingin menghitung vektor satuan biru mengingat dua segmen garis merah (yang sebenarnya 3 poin dan karenanya dijamin akan terhubung)

Segmen merah memiliki panjang sewenang-wenang, dan hasilnya tidak harus berupa unit, itu hanya akan lebih mudah bagi saya.
Ini juga akan berguna untuk memiliki cara untuk memaksa vektor yang dihasilkan untuk menunjuk ke arah tertentu (relatif terhadap segmen input), ini tidak penting karena saya pikir saya dapat mengerjakan yang ini - karena segmen jalur input pada akhirnya terbentuk sebuah n-gon.

Setiap contoh akan ideal di C ++, tetapi bahasa lain menyambut.

Terima kasih banyak untuk petunjuk apa pun.

Jawaban:


13

Buat dan normalkan dua vektor dari segmen merah Anda, mulai dari titik komonnya, lalu tambahkan hasilnya (komponen demi komponen). Kemudian Anda dapat menormalkan output jika Anda ingin mendapatkan vektor satuan.

Masalahnya adalah Anda akan selalu berakhir pada kasus kedua, karena sudut antara 2 vektor akan selalu kurang dari 180 °. Tapi tentu saja Anda bisa membuat vektor yang berlawanan dan melihat mana yang lebih sesuai dengan tujuan Anda.

Juga ada kasus khusus ketika kedua vektor disejajarkan dan rata-rata akan menjadi 0 (tetapi Anda dapat dengan mudah mendeteksinya).


Bagus, saya pikir inilah yang saya cari! Saya tahu itu mudah :) Saya akan membiarkannya terbuka hanya untuk melihat apa tanggapan lain yang saya dapatkan ... Terima kasih
Adam Naylor

Saya akan menulis metode yang lebih kompleks yang melibatkan produk titik meskipun saya telah menggunakan metode sederhana ini sebelumnya, doh!
CiscoIPPhone

Apa yang Anda maksud dengan "Masalahnya adalah bahwa Anda akan selalu berakhir adalah kasus kedua"?
CiscoIPPhone

@ CiscoIPPhone Saya yakin dia merujuk pada diagram saya. Solusi titik produk lebih dari sekadar menyambut CiscoIPPhone, setidaknya saya akan memberikan +1 :)
Adam Naylor

Memang saya mengacu pada gambar Anda. Menggunakan produk titik, Anda bisa mendapatkan sudut antara dua vektor, tetapi sekali lagi itu akan tetap di bawah 180 °.
XGouchet

1

Saya pikir Anda bisa mendapatkan arah agar konsisten dengan memperlakukan ini seolah-olah Anda menghasilkan vertex 2D normal. Itu adalah:

  1. Ambil masing-masing vektor merah, tukar komponen x dan y dan negasikan salah satunya untuk membuat normals.

  2. Normalisasi mereka.

  3. Jumlahkan kedua vektor itu, dan renormalkan kembali.

Anda mungkin juga ingin menguji untuk kasus di mana dua garis merah saling tumpang tindih - renormalisasi akhir akan mencoba untuk membagi dengan nol di sana.


Terima kasih Adam, apakah pendekatan ini punya nama? Saya ingin melihat lebih jauh ...
Adam Naylor

Tidak yang saya tahu. Trik pembuatan vektor normal dijelaskan di stackoverflow.com/questions/1243614/...
Adam

0

Biarkan A dan B menjadi vektor Anda:

hasil

Vektor penjumlahan tidak harus berupa vektor satuan tetapi panjangnya hanya sama, jika | A | > = | B |, Anda dapat:

hasil yang setara

yang lebih stabil secara numerik karena Anda hanya memiliki sebagian kecil dan penyebut yang lebih besar

bagaimana jumlah bekerja

Hasil yang sama dapat diperoleh dengan substraksi, sekali lagi vektor harus sama panjangnya

Ini hanya berfungsi untuk sudut non-cembung; Anda dapat dengan mudah menguji apakah sudut Anda cembung dan kalikan H dengan -1


Saya tidak berpikir ini akan berhasil jika | A | ! = | B | ... pertimbangkan A = [0,1] B = [100,0], hasilnya bukan [.707, .707]
Richard Fabian

@ Richard Fabian Anda benar, saya lupa ketimpangan Triangle!
FxIII
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.