Pertama - saya tahu saya sangat padat di sini.
Dengan itu, saya mencoba untuk menulis implementasi C # dari algoritma ini:
var results = []
for each -N ≤ dx ≤ N:
for each max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N):
var dz = -dx-dy
results.append(cube_add(center, Cube(dx, dy, dz)))
Saya telah mengambil ini dari sumber yang luar biasa ini .
Masalah saya adalah bahwa setiap implementasi yang telah saya coba sejauh ini memiliki hasil gila. Misalnya, kode yang ditunjukkan di bawah saat ini menghasilkan ini:
dan ini:
Kode saya saat ini duduk seperti ini:
for (int x = this.CellPositionX - distance; x <= this.CellPositionX + distance; x++)
{
for (int y = this.CellPositionY - Math.Max(-distance, -x - distance); y <= this.CellPositionY + Math.Min(distance, -x + distance); y++)
{
HexPosition rangePosition = new HexPosition(x, y);
range.Add(rangePosition);
}
}
Adakah yang bisa melihat sesuatu yang salah di sini? Semua saran diterima. Saya telah membenturkan kepala saya pada yang satu ini sekarang.
Terima kasih!
Catatan yang diperbarui: Saya menggunakan koordinat Aksial dalam kisi. Perbarui # 2: seperti yang ditunjukkan di bawah ini, saya punya for..each loop salah dan tidak menggunakan delta untuk bekerja. Terima kasih untuk bantuannya!
Saat ini saya memiliki masalah seperti yang ditunjukkan di bawah ini dengan implementasi dari jawaban:
Saya akan terus menyelidiki - jika saya mengetahuinya saya akan memposting hasil lengkap di sini. Terima kasih semuanya!
sumber
Jawaban:
Jadi setelah pemeriksaan lebih lanjut masalah Anda sebenarnya tidak ada hubungannya dengan mengoordinasikan konversi sistem. Ini bisa dibuat lebih jelas dengan tidak menyebutkan koordinat aksial Anda X dan Y melainkan Q dan R. Masalah yang sebenarnya Anda miliki adalah kondisi loop buruk. Sampel kode asli menghasilkan delta q dan r yang Anda coba konversi, dalam loop Anda, ke koordinat absolut dan Anda membuat kesalahan. Algoritma seharusnya terlihat sebagai berikut:
sumber
Seperti yang dicatat Vector57 , masalahnya adalah Anda menggunakan sistem koordinat yang salah . Algoritma yang dijelaskan dimaksudkan untuk digunakan dengan koordinat kubus , yang memiliki komponen x, y dan z :
Ini mungkin tidak jelas dari pseudocode algoritma, tapi itu karena ini penyederhanaan dari ini :
... loop bersarang polos di atas x, y dan z, apa yang Anda harapkan dari algoritma rentang.
Saya tidak tahu sistem koordinat apa yang Anda gunakan, tapi saya kira itu salah satu sistem "offset koordinat", yang populer karena mudah diimplementasikan dengan menempatkan sel-sel jaringan di dalam array 2D:
Ini tidak berarti Anda tidak dapat menggunakan algoritma kubus ini; itu hanya berarti Anda perlu mengkonversi dari koordinat kubus ke Anda sendiri . Misalnya, untuk mengkonversi ke / dari tata letak vertikal "odd-q", gunakan ini:
sumber
q = x
danr = y
sistem juga?