मैंने पहले से ही एक समान प्रश्न का उत्तर दिया है, समान लक्ष्यों के साथ, स्टैक ओवरफ्लो पर मैं इसे यहाँ पुनर्विचार के लिए आश्वस्त करूँगा: (एनबी - सभी कोड जावा में लिखा और परीक्षण किया गया है)
यह छवि एक हेक्सागोनल ग्रिड के ऊपरी बाएं कोने को दिखाती है और ओवरलैड एक नीला वर्ग ग्रिड है। यह पता लगाना आसान है कि कौन से वर्ग के अंदर एक बिंदु है और यह एक मोटा अंदाजा देता है कि षट्भुज भी है। हेक्सागोन्स के सफेद हिस्से दिखाते हैं कि वर्ग और हेक्सागोनल ग्रिड एक ही निर्देशांक साझा करते हैं और हेक्सागोन्स के ग्रे हिस्से दिखाते हैं कि वे कहां नहीं हैं।
समाधान अब उतना ही सरल है जितना कि एक बिंदु किस बॉक्स में है, तो यह देखने के लिए जाँच करें कि बिंदु त्रिकोण में से किसी में है या नहीं, और यदि आवश्यक हो तो उत्तर को सही करें।
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);
इस बिंदु पर हमारे पास बॉक्स की पंक्ति और कॉलम है, जो हमारे बगल में है, हमें अपने बिंदु को हेक्सागोन के दो शीर्ष किनारों के खिलाफ परीक्षण करने की आवश्यकता है, यह देखने के लिए कि क्या हमारी बात ऊपर के दोनों हेक्सागोन्स में निहित है:
// 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);
सापेक्ष निर्देशांक होने से अगला कदम आसान हो जाता है।
जैसे ऊपर की छवि में, अगर हमारी बात का y > mx + c है, तो हम जानते हैं कि हमारी बात रेखा के ऊपर है, और हमारे मामले में, ऊपर और वर्तमान पंक्ति और स्तंभ के बाईं ओर षट्भुज है। ध्यान दें कि java में निर्देशांक प्रणाली स्क्रीन के ऊपर बाईं ओर 0 से शुरू हो रही है और नीचे बाईं तरफ नहीं है जैसा कि सामान्य रूप से गणित में होता है, इसलिए बाएं किनारे के लिए उपयोग किए जाने वाले नकारात्मक ढाल और दाईं ओर उपयोग किए गए सकारात्मक ढाल के लिए है।
// 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];
}
उपरोक्त उदाहरण में प्रयुक्त चर की त्वरित व्याख्या:
m ढाल है, इसलिए m = c / halfWidth
NeoShamam उपरोक्त के अतिरिक्त है
यह सेबस्टियनट्रॉ के जवाब का एक परिशिष्ट है। मैं इसे एक टिप्पणी के रूप में छोड़ दूंगा, लेकिन अभी तक मेरी पर्याप्त प्रतिष्ठा नहीं है।
यदि आप यहां वर्णित के रूप में एक अक्षीय समन्वय प्रणाली लागू करना चाहते हैं:
http://www.redblobgames.com/grids/hexagons/
आप कोड में थोड़ा संशोधन कर सकते हैं।
के बजाय
// 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);
इसे इस्तेमाल करो
float columnOffset = row * halfWidth;
column = (int)(x + columnOffset)/gridWidth; //switch + to - to align the grid the other way
इससे निर्देशांक (0, 2) समान विकर्ण स्तंभ पर होगा (0, 0) और (0, 1) सीधे नीचे (0, 0) होने के बजाय।