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.
private final Hexagon getSelectedHexagon(int x, int y)
{
// Find the row and column of the box that the point falls in.
int row = (int) (y / gridHeight);
int column;
boolean rowIsOdd = row % 2 == 1;
// Is the row an odd number?
if (rowIsOdd)// Yes: Offset x to match the indent of the row
column = (int) ((x - halfWidth) / gridWidth);
else// No: Calculate normally
column = (int) (x / gridWidth);
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:
// Work out the position of the point relative to the box it is in
double relY = y - (row * gridHeight);
double relX;
if (rowIsOdd)
relX = (x - (column * gridWidth)) - halfWidth;
else
relX = x - (column * gridWidth);
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.
// Work out if the point is above either of the hexagon's top edges
if (relY < (-m * relX) + c) // LEFT edge
{
row--;
if (!rowIsOdd)
column--;
}
else if (relY < (m * relX) - c) // RIGHT edge
{
row--;
if (rowIsOdd)
column++;
}
return hexagons[column][row];
}
Penjelasan singkat tentang variabel yang digunakan dalam contoh di atas:
m adalah gradien, jadi m = c / halfWidth
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
// Is the row an odd number?
if (rowIsOdd)// Yes: Offset x to match the indent of the row
column = (int) ((x - halfWidth) / gridWidth);
else// No: Calculate normally
column = (int) (x / gridWidth);
Gunakan ini
float columnOffset = row * halfWidth;
column = (int)(x + columnOffset)/gridWidth; //switch + to - to align the grid the other way
Ini akan membuat koordinat (0, 2) berada pada kolom diagonal yang sama dengan (0, 0) dan (0, 1) bukannya langsung di bawah (0, 0).