আমি ইতিমধ্যে একটি অনুরূপ প্রশ্নের উত্তর দিয়েছি, অভিন্ন লক্ষ্য নিয়ে, স্ট্যাক ওভারফ্লোতে আমি এটি দৃin়তার জন্য এখানে আবার পোস্ট করব: (এনবি - সমস্ত কোড জাভাতে লেখা এবং পরীক্ষিত)
এই চিত্রটি ষড়জাগ্রীয় গ্রিডের উপরের বাম কোণটি দেখায় এবং ওভারলাইড একটি নীল বর্গাকার গ্রিড। কোন বর্গের ভিতরে কোন স্কোয়ার রয়েছে তা খুঁজে পাওয়া সহজ এবং এটি কোন ষড়ভুজকে মোটামুটি অনুমান করতে পারে। হেক্সাগনগুলির সাদা অংশগুলি দেখায় যেখানে বর্গ এবং ষড়জাগ্রীয় গ্রিড একই স্থানাঙ্কগুলি ভাগ করে এবং ষড়জাগুলির ধূসর অংশগুলি কোথায় দেখায় তা দেখায় না।
সমাধানটি এখন কোনও পয়েন্টের কোন বাক্সে রয়েছে তা সন্ধান করার মতো সহজ, তারপরে বিন্দুটি কোনও ত্রিভুজগুলির মধ্যে রয়েছে কিনা তা পরীক্ষা করে দেখুন, এবং প্রয়োজনে উত্তরটি সংশোধন করুন।
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 যদি > এমএক্স + সি হয় তবে আমরা জানি আমাদের পয়েন্টটি রেখার উপরে রয়েছে এবং আমাদের ক্ষেত্রে, ষড়ভুজটি উপরের এবং বর্তমান সারি এবং কলামের বামে রয়েছে। নোট করুন যে জাভাতে স্থানাঙ্ক ব্যবস্থাটি স্ক্রিনের উপরের বামে 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];
}
উপরের উদাহরণে ব্যবহৃত ভেরিয়েবলগুলির দ্রুত ব্যাখ্যা:
মিটি গ্রেডিয়েন্ট, সুতরাং এম = সি / অর্ধপথ
এটি সেবাস্তিয়ান ট্রয়ের উত্তরের একটি সংযোজন। আমি এটিকে একটি মন্তব্য হিসাবে রেখে দেব তবে আমি এখনও যথেষ্ট খ্যাতি পাই না।
আপনি যদি এখানে বর্ণিত হিসাবে অক্ষীয় সমন্বয় ব্যবস্থা বাস্তবায়ন করতে চান:
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, 0) এবং (0, 1) হিসাবে একই তির্যক কলামে থাকবে।