Game isometrik 2D saya menggunakan peta kisi heksagonal. Mengacu pada gambar di bawah, bagaimana cara memutar struktur segi enam biru muda sebesar 60 derajat di sekitar segi enam merah muda?
EDIT:
Hex utama adalah (0,0). Hexes lainnya adalah anak-anak, jumlah mereka tetap. Saya akan mendefinisikan hanya satu posisi (dalam hal ini kanannya) dan menghitung arah lain jika diperlukan (kiri-bawah, bot-kanan, kanan-atas, kiri-atas dan kiri). Hex lainnya didefinisikan seperti: Package.Add (-1,0), Package.Add (-2,0) dan seterusnya.
switch(Direction)
{
case DirRightDown:
if(Number.Y % 2 && Point.X % 2)
Number.X += 1;
Number.Y += Point.X + Point.Y / 2;
Number.X += Point.X / 2 - Point.Y / 1.5;
break;
}
Dalam kode ini Number
adalah hex utama dan Point
hex yang ingin saya putar, tetapi tidak berfungsi:
2d
rotation
maps
hexagonal-grid
ruzsoo
sumber
sumber
Jawaban:
Seperti yang dicatat Martin Sojka , rotasi lebih sederhana jika Anda mengonversi ke sistem koordinat yang berbeda, melakukan rotasi, lalu mengonversi kembali.
Saya menggunakan sistem koordinat yang berbeda dari yang dilakukan Martin, berlabel
x,y,z
. Tidak ada goyangan dalam sistem ini, dan ini berguna untuk banyak algoritma hex. Dalam sistem ini Anda dapat memutar heks sekitar0,0,0
dengan "memutar" koordinat dan membalik tanda-tanda mereka:x,y,z
berubah menjadi-y,-z,-x
satu arah dan-z,-x,-y
ke arah lain. Saya punya diagram di halaman ini .(Saya minta maaf tentang x / y / z vs X / Y tapi saya menggunakan x / y / z di situs saya dan Anda menggunakan X / Y dalam kode Anda sehingga dalam menjawab hal ini penting! Jadi saya akan menggunakan
xx,yy,zz
sebagai nama variabel di bawah ini untuk mencoba membuatnya lebih mudah untuk dibedakan.)Konversi
X,Y
koordinat Anda kex,y,z
format:Lakukan rotasi dengan 60 ° dengan satu cara atau yang lain:
Konversi
x,y,z
kembali ke AndaX,Y
:Misalnya, jika Anda mulai dengan (X = -2, Y = 1) dan ingin memutar 60 ° ke kanan, Anda akan mengonversi:
kemudian putar
-2,1,1
60 ° ke kanan dengan:seperti yang Anda lihat di sini:
lalu konversikan
-1,2,-1
kembali:Jadi (X = -2, Y = 1) berputar 60 ° ke dalam (X = -2, Y = -1).
sumber
Mari kita tentukan nomor baru. Jangan khawatir, ini mudah.
Atau, sederhananya: f = √3 × i , dengan i menjadi unit imajiner . Dengan ini, rotasi 60 derajat searah jarum jam sama dengan perkalian dengan 1/2 × (1 - f ) , dan rotasi 60 derajat berlawanan arah jarum jam sama dengan perkalian dengan 1/2 × (1 + f ) . Jika ini terdengar aneh, ingatlah bahwa perkalian dengan bilangan kompleks sama dengan rotasi pada bidang 2D. Kami hanya "menekan" bilangan kompleks dalam arah imajiner sedikit (oleh √3) untuk tidak harus berurusan dengan akar kuadrat ... atau bukan bilangan bulat, dalam hal ini.
Kita juga dapat menulis titik (a, b) sebagai a + b × f .
Ini memungkinkan kita memutar titik mana pun di pesawat; misalnya, titik (2,0) = 2 + 0 × f berputar ke (1, -1), lalu ke (-1, -1), (-2,0), (-1,1), ( 1,1) dan akhirnya kembali ke (2,0), cukup dengan mengalikannya.
Tentu saja, kita membutuhkan cara untuk menerjemahkan titik-titik itu dari koordinat kita ke titik-titik rotasi yang kita lakukan, dan kemudian kembali lagi. Untuk ini, sedikit informasi lain yang diperlukan: Jika titik yang kita lakukan rotasi di sekitar adalah ke "kiri" atau ke "kanan" dari garis vertikal. Untuk kesederhanaan, kami menyatakan bahwa memiliki nilai "goyangan" w dari 0 jika di sebelah kiri (seperti pusat rotasi [0,0] di dua gambar bawah Anda), dan dari 1 jika ke kanan itu. Ini memperluas poin asli kami menjadi tiga dimensi; ( x , y , w ), dengan "w" menjadi 0 atau 1 setelah normalisasi. Fungsi normalisasi adalah:
NORM: ( x , y , w ) -> ( x + lantai ( w / 2), y , w mod 2), dengan operasi "mod" yang ditentukan sehingga hanya mengembalikan nilai positif atau nol.
Algoritma kami sekarang terlihat sebagai berikut:
Ubah titik kita ( a , b , c ) ke posisi mereka relatif terhadap pusat rotasi ( x , y , w ) dengan menghitung ( a - x , b - y , c - w ), lalu menormalkan hasilnya. Ini menempatkan pusat rotasi di (0,0,0) jelas.
Ubah poin kami dari koordinat "asli" ke koordinat rotasi: ( a , b , c ) -> (2 × a + c , b ) = 2 × a + c + b × f
Putar poin kami dengan mengalikannya dengan salah satu angka rotasi di atas, sesuai kebutuhan.
Ra-mengubah titik kembali dari koordinat rotasi ke yang "asli": ( r , s ) -> (lantai ( r / 2), s , r mod 2), dengan "mod" didefinisikan seperti di atas.
Ubah kembali poin kembali ke posisi semula dengan menambahkannya ke pusat rotasi ( x , y , z ) dan normalisasi.
Sebuah versi sederhana dari kami "tripleks" nomor berdasarkan f di C ++ akan terlihat seperti ini:
sumber