Saya adalah pengembang game actionScript flash yang agak terbelakang dengan matematika, meskipun saya menemukan fisika menarik dan keren.
Untuk referensi, ini adalah game yang mirip dengan yang saya buat: Flash game Untangled
Saya telah membuat game yang tidak terurai ini hampir sepenuhnya melengkapi logika. Tetapi, ketika dua garis berpotongan, saya membutuhkan garis berpotongan atau 'kusut' untuk menunjukkan warna yang berbeda; merah.
Anda akan sangat baik jika Anda dapat menyarankan algoritme untuk mendeteksi tabrakan segmen garis . Saya pada dasarnya adalah orang yang suka berpikir 'visual' daripada 'aritmatika' :)
Sunting: Saya ingin menambahkan beberapa diagram untuk membuat menyampaikan gagasan lebih jelas
PS Saya mencoba membuat fungsi sebagai
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Terima kasih sebelumnya.
Jawaban:
Saya menggunakan metode berikut yang cukup banyak hanya merupakan implementasi dari algoritma ini . Itu dalam C # tetapi menerjemahkannya ke ActionScript harus sepele.
Ada masalah yang halus dengan algoritma, yaitu kasus di mana dua garis bertepatan tetapi tidak tumpang tindih. Algoritme masih mengembalikan intersectioin dalam kasus itu. Jika Anda peduli tentang kasus itu, saya yakin jawaban ini di stackoverflow memiliki versi yang lebih kompleks yang mengatasinya.
Edit
Aneh, saya sudah mengujinya dan itu bekerja untuk saya kecuali untuk satu kasus yang saya jelaskan di atas. Menggunakan versi yang persis sama yang saya posting di atas, saya mendapatkan hasil ini ketika saya mengambilnya untuk test drive:
sumber
Tanpa Divisi! Jadi tidak ada masalah dengan presisi atau pembagian dengan nol.
Segmen baris 1 adalah A ke B Segmen baris 2 adalah C ke D
Garis adalah garis yang tidak pernah berakhir, segmen garis adalah bagian yang ditentukan dari garis itu.
Periksa apakah dua kotak pembatas berpotongan: jika tidak ada persimpangan -> Tanpa Salib! (perhitungan dilakukan, return false)
Periksa apakah garis seg 1 mengangkang garis seg 2 dan apakah garis seg 2 mengangkang garis seg 1 (mis., Segmen Segmen 1 ada di kedua sisi Garis yang ditentukan oleh Segmen garis 2).
Ini dapat dilakukan dengan menerjemahkan semua titik dengan -A (mis. Anda memindahkan 2 baris sehingga A berada di dalam (0,0))
Kemudian Anda memeriksa apakah titik C dan D berada di sisi yang berbeda dari garis yang didefinisikan oleh 0,0 ke B
Jika Anda belum mendapatkan "No Cross" maka lanjutkan menggunakan bukan A, B versus C, D tetapi C, D versus A, B (kalori yang sama, cukup tukar A dan C, B dan D), jika tidak ada "Tidak ada Salib!" maka Anda memiliki persimpangan!
Saya mencari perhitungan yang tepat untuk produk silang dan menemukan posting blog ini yang menjelaskan metode juga.
sumber
Saya hanya ingin mengatakan, saya membutuhkannya untuk game Gamemaker Studio saya dan ini bekerja dengan baik:
sumber
Jawaban yang diterima memberikan jawaban yang salah dalam hal ini:
Garis-garis ini jelas tidak berpotongan, tetapi menurut fungsi dalam "jawaban yang benar", garis-garis itu berpotongan.
Inilah yang saya gunakan:
mengembalikan 0 = garis tidak berpotongan
kembali> 0 = garis berpotongan
Perbarui untuk menjawab pertanyaan:
Saya tidak membuat kode ini sendiri. Sudah lebih dari 5 tahun dan saya tidak tahu apa sumber aslinya. Tapi..
Saya pikir nilai kembali adalah posisi relatif dari baris pertama di mana mereka menyeberang (untuk menjelaskannya dengan buruk). Untuk menghitung titik persimpangan Anda mungkin bisa menggunakan lerp seperti ini:
(SAYA TIDAK MENGUJI INI)
sumber