Lihatlah gambar ini
Seperti yang Anda lihat ada cara yang relatif intuitif untuk memetakan sistem koordinat persegi panjang x ke sistem heksagonal.
Kita dapat berbicara tentang heksagon tidak beraturan "segi empat" yaitu heksagon yang tertulis dalam elips atau heksagon yang diperoleh dari heksagon biasa yang diskalakan di kedua arah secara tidak proporsional (tidak ada rotasi-geser).
Segi enam segi empat dapat ditentukan oleh tinggi dan lebar persegi panjang yang membatasi ditambah lebar dari yang menuliskan. (W, w, h)
Cara termudah untuk mengetahui indeks heksagonal adalah dengan mempartisi ruang sebagai berikut:
Lebar persegi panjang adalah w + (W - w) / 2 = (w + W) / 2, tingginya h / 2; lebar kotak hijau adalah (Ww) / 2. Mudah untuk menemukan di mana titik persegi jatuh:
u dan v adalah pengingat koordinat yang menunjukkan di mana titik berada di dalam persegi panjang i, j: Menggunakan w kita dapat mengatakan apakah kita berada di area hijau (u <(Ww) / 2) atau tidak.
jika demikian halnya kita berada di area hijau kita perlu tahu apakah kita berada di bagian atas atau bawah dari segi enam: kita berada di bagian atas jika i dan j sama-sama genap atau keduanya ganjil; kita berada di bagian bawah sebaliknya.
Dalam kedua kasus itu berguna untuk melakukan trasform u dan v sehingga bervariasi antara 0 dan 1:
jika kita berada di bagian bawah dan v <u
atau
jika kita berada di bagian atas dan (1-v)> u
maka kita mengurangi satu per satu
Sekarang kita hanya perlu mengurangi satu per satu jika saya aneh untuk melihat bahwa saya adalah indeks segi enam horizontal (kolom) dan bagian integer dari j / 2 adalah indeks segi enam vertikal (baris)
Heksagon biasa memiliki enam sumbu simetri, tetapi saya akan menganggap heksagon Anda hanya memiliki dua sumbu simetri ( yaitu. Semua sudut tidak persis 60 derajat). Tidak harus karena milik Anda tidak memiliki simetri penuh, tetapi karena mungkin bermanfaat bagi orang lain.
Berikut adalah parameter satu segi enam. Pusatnya adalah di
O
, lebar terbesar adalah2a
, tingginya2b
, dan panjang tepi atas adalah2c
.Ini adalah tata letak baris / kolom, dengan asal di tengah hexagon kiri bawah. Jika pengaturan Anda berbeda, terjemahkan
(x,y)
koordinat Anda untuk kembali ke kasus ini, atau gunakan-y
sebagaiy
contoh:Kode berikut akan memberi Anda baris dan kolom segi enam yang berisi titik
(x,y)
:Anda dapat memeriksa bahwa kode di atas menggambar hexagon sempurna pada proses IdeOne ini .
sumber
Anda bisa memasukkan 3 persegi panjang yang diputar di dalam area segi enam, dan jika dilakukan dengan benar akan mengisi area dengan tepat. Maka itu hanya masalah memeriksa tabrakan pada tiga persegi panjang.
sumber
Anda mungkin tidak perlu membatalkan pendaftaran klik di antara ubin. Dengan kata lain, itu tidak akan sakit dan bahkan mungkin membantu pemain jika Anda membiarkan ruang di antara ubin menjadi klik juga, kecuali jika Anda berbicara tentang ruang besar di antara mereka yang diisi dengan sesuatu yang secara logis tidak seharusnya dilakukan. diklik. (Katakanlah, heksa adalah kota di peta besar di mana di antara keduanya ada hal-hal yang dapat diklik lainnya seperti orang)
Untuk melakukan hal di atas, Anda cukup memplot pusat semua heks, dan kemudian menemukan yang terdekat ke mouse ketika mengklik bidang semua heks. Pusat terdekat pada bidang segi enam tessellated akan selalu sama dengan yang Anda tumpangi.
sumber
Saya sudah menjawab pertanyaan serupa, dengan tujuan yang identik, di atas Stack Overflow saya akan memposting ulang di sini untuk kenyamanan: (NB - semua kode ditulis dan diuji di Jawa)
Gambar ini menunjukkan sudut kiri atas dari sebuah grid heksagonal dan overlay adalah grid persegi biru. Sangat mudah untuk menemukan yang mana dari kuadrat sebuah titik di dalam dan ini akan memberikan perkiraan kasar yang segi enam juga. Bagian putih dari segi enam menunjukkan di mana kotak persegi dan heksagonal berbagi koordinat yang sama dan bagian abu-abu dari segi enam menunjukkan di mana mereka tidak.
Solusinya sekarang sesederhana menemukan kotak mana titik dalam, kemudian memeriksa untuk melihat apakah titik tersebut di salah satu dari segitiga, dan mengoreksi jawabannya jika perlu.
Pada titik ini kita memiliki baris dan kolom kotak tempat kita berada, selanjutnya kita perlu menguji titik kita terhadap dua tepi atas segi enam untuk melihat apakah titik kita terletak pada salah satu dari segi enam di atas:
Memiliki koordinat relatif membuat langkah selanjutnya lebih mudah.
Seperti pada gambar di atas, jika y titik kita adalah > mx + c, kita tahu titik kita terletak di atas garis, dan dalam kasus kita, segi enam di atas dan di sebelah kiri baris dan kolom saat ini. Perhatikan bahwa sistem koordinat di java memiliki y mulai dari 0 di kiri atas layar dan bukan kiri bawah seperti biasa dalam matematika, maka gradien negatif digunakan untuk tepi kiri dan gradien positif digunakan untuk kanan.
Penjelasan singkat tentang variabel yang digunakan dalam contoh di atas:
m adalah gradien, jadi m = c / halfWidth
Selain NeoShamam di atas
Ini merupakan tambahan untuk jawaban SebastianTroy. Saya akan meninggalkannya sebagai komentar tetapi reputasi saya belum cukup.
Jika Anda ingin menerapkan sistem koordinat aksial seperti dijelaskan di sini: http://www.redblobgames.com/grids/hexagons/
Anda dapat membuat sedikit modifikasi pada kode.
Dari pada
Gunakan ini
Ini akan membuat koordinat (0, 2) berada pada kolom diagonal yang sama dengan (0, 0) dan (0, 1) bukannya langsung di bawah (0, 0).
sumber
Jika semua segi enam Anda dibuat menggunakan proporsi dan penempatan yang sama, Anda dapat menggunakan semacam aset overlay untuk tabrakan, sesuatu di sepanjang baris:
Kemudian, yang harus Anda lakukan adalah menempatkan gambar tabrakan di tempat segi enam Anda, dapatkan posisi mouse relatif ke sudut kiri, dan lihat apakah piksel posisi relatif TIDAK putih (yang berarti ada tabrakan).
Kode (tidak diuji):
Anda jelas dapat melakukan pemeriksaan tabrakan persegi panjang sebelumnya (dari seluruh gambar segi enam Anda) untuk meningkatkan kinerja seluruh proses.
Konsep ini cukup sederhana untuk dipahami dan diimplementasikan, tetapi hanya berfungsi jika segi enam Anda sama. Ini juga bisa berfungsi jika Anda hanya memiliki satu set dimensi segi enam yang memungkinkan, yang kemudian berarti bahwa Anda akan membutuhkan lebih dari satu overlay tabrakan.
Jika menemukan itu menjadi solusi yang sangat sederhana untuk apa yang bisa menjadi jauh lebih lengkap dan dapat digunakan kembali (menggunakan matematika untuk benar-benar menemukan tabrakan) tetapi pasti patut dicoba menurut pendapat saya.
sumber
Ada sebuah artikel tentang Pemrograman Game Permata 7 yang disebut Untuk Lebah dan Gamer: Cara Menangani Ubin Heksagonal yang akan persis seperti yang Anda butuhkan.
Sayangnya saya tidak membawa salinan buku itu saat ini, kalau tidak saya bisa menggambarkannya sedikit.
sumber