Bagaimana Anda menghitung jika 2 garis menghadap ke atau jauh?


10

Dengan 4 poin yang menggambarkan 2 segmen garis, bagaimana Anda menghitung jika garis A mengarah atau jauh dari garis B?

2 garis memiliki panjang tetap, dan dapat diukur sebagai jarak dari x1 / y1 ke x2 / y2.

masukkan deskripsi gambar di sini


Bagaimana halnya dengan kurva bezier berbeda dari kasus dengan garis lurus? Apakah Anda memiliki kurva yang benar-benar dapat melampirkan garis lain (sehingga setiap arah akan menunjuk "ke arah")?
bummzack

1
Anda mungkin perlu mengklarifikasi persyaratan Anda. Dalam Geometri, "garis" meluas tanpa batas di kedua arah, berlawanan dengan setengah garis atau segmen, sehingga 2 garis selalu bersilangan kecuali jika paralel. Yang mana yang kamu tanyakan? Anda telah menggambar panah, yang menyiratkan arah, yang bagi saya menyiratkan segmen atau paling banyak setengah garis. Dan apa definisi Anda tentang "menuju" dan "pergi"?
Hackworth

Kurva Bezier mungkin lebih sulit untuk diwakili dalam kesetaraan yang dibutuhkan untuk menyelesaikan uji potong garis-ray. Ngomong-ngomong, aku akan mengubah kata yang mewakili panahmu menjadi "ray". Anda mungkin mendapatkan respons yang lebih cepat. Saya akan menjawab ini jika saya punya waktu saat makan siang jika tidak ada orang lain. Jika tidak, ini adalah tugas yang sangat umum dalam permainan. Google "uji potong segmen garis Ray". Saya menduga tes kurva bezier serupa, tetapi saya belum pernah mencobanya.
brandon

3
Anda harus membagi pertanyaan Anda menjadi dua. Bagian dengan segmen garis sangat mudah. Bagian dengan kurva bezier sangat kompleks dan hanya memiliki solusi numerik perkiraan.
sam hocevar

Saya telah membagi pertanyaan saya menjadi 2, seperti yang diminta. Bagian ke-2 ada di sini: gamedev.stackexchange.com/questions/21463/…
Robinicks

Jawaban:


11

Biarkan Adan Bjadilah dua poin di garis hitam. Biarkan Cdan Djadilah segmen biru Anda. Tanda zkoordinat produk silang AB^ACmemberi tahu Anda apakah C"kiri" atau "kanan" dari garis hitam. Demikian pula, produk silang AB^CDmemberi tahu Anda apakah CDmengarahkan "kiri" atau "kanan" garis hitam.

Kami benar-benar tidak ingin tahu apakah itu kiri atau kanan; semua yang kita inginkan adalah memastikan mereka memiliki arah yang sama atau arah yang berlawanan, itu sebabnya kita mengalikan dua nilai.

Karena itu pseudocode berikut harus berfungsi:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Saya khawatir saya perlu waktu untuk menulis solusi yang tepat untuk kurva Bezier. Apakah situasi berikut menuju atau pergi?

Masalah?


Untuk kurva, saya yakin Anda bisa menemukan garis singgung kurva pada titik terdekat dengan segmen garis Anda dan menggunakannya dengan cara yang sama Anda menguji segmen garis lainnya. Mungkin sedikit lebih sulit daripada kedengarannya :)
not

@stephelton: Lihat kembali pada gambar kedua untuk kurva bezier, menunjuk ke arah kurva yang melengkung. Atau pertimbangkan kurva dengan garis singgung sejajar dengan segmen yang mungkin bersinggungan, tetapi yang melengkung ke arah segmen dan bersinggungan.
Cascabel

+1 untuk trollface, dan matematika yang bagus :). Namun diagram 'ke' Anda sebenarnya masih memiliki 'jauh' - cukup pindahkan titik awal di atas garis.
Jonathan Dickinson

@JonathanDickinson terima kasih, saya memperbarui gambar untuk membuatnya sedikit lebih jelas apa interogasi saya!
sam hocevar

2

Dengan asumsi titik awal adalah lingkaran hijau, dan titik akhir adalah panah merah

Hitung jarak antara titik awal sebagai DS dan segmen hitam, dan lakukan hal yang sama untuk titik akhir (panah merah) sebagai DE. Jika DS> DE, maka segmen menunjuk ke arah. jika DE> DS, itu menunjuk pergi. Jika keduanya sama, keduanya paralel.

Anda dapat menemukan cara menghitung jarak dari titik ke segmen di sini , dan ke kurva bezier kuadratik di sini . Namun, tergantung pada bentuk kurva bezier, itu mungkin mengembalikan hasil yang aneh (kurva dapat melintasi sendiri)


DS> DE dijamin hanya berfungsi untuk garis lurus. Itu bisa gagal untuk Beziers. Juga, Anda tidak tahu definisi "ke". Jika ekstensi panah akan melewati garis yang ditentukan oleh 2 poin, tetapi bukan segmen yang ditentukan oleh titik yang sama, apakah masih "mengarah"?
Hackworth

Saya berbicara tentang dua segmen, bukan garis, jadi tidak ada "ekstensi panah". Juga, tidak masalah di mana panah menunjuk, karena kita berbicara tentang jarak di sini. Titik terdekat pada garis hitam bisa menjadi titik awal / akhir garis hitam, tidak masalah. Kedua segmen tersebut bisa berupa collinear, metode ini akan tetap berfungsi sebagaimana dimaksud. Untuk kurva bezier saya sebutkan itu akan memberikan hasil yang aneh tergantung dari bentuk kurva.
Ravachol
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.