Я создал небольшую инфраструктуру с шестигранной сеткой для Unity3D и пришел к следующей дилемме. Это моя система координат (взято отсюда ):
Все это работает довольно хорошо, за исключением того факта, что я понятия не имею, как его хранить. Первоначально я намеревался хранить это в 2D-массиве и использовать изображения для создания своих карт.
Одна проблема заключалась в том, что он имел отрицательные значения (это было легко исправить, немного сместив координаты).
Однако из-за этой системы координат такое изображение или растровое изображение должны иметь ромбовидную форму - и поскольку эти структуры имеют квадратную форму, это вызовет много головных болей, даже если я что-то взломаю вместе. Я что-то пропустил, что могло бы это исправить? Я помню, как видел сообщение на форуме об этом на форумах Unity, но больше не могу найти ссылку.
Является ли написание набора переводчиков координат лучшим решением здесь?
Если вы, ребята, думаете, что это будет полезно, я могу опубликовать код и изображения моей проблемы.
Ответы:
С координатами параллелограмма, с которыми вы работаете, работать проще, но у них есть недостаток: они странные для прямоугольных карт. Один из подходов - сохранить его с координатами смещения, но фактически использовать координаты параллелограмма в игровой логике.
Наблюдение: в каждой строке карты данные сетки непрерывны. Все потраченное впустую пространство находится слева и справа.
Решение: в этой строке сохраняйте данные, начиная с крайнего левого столбца, а не столбца, помеченного 0. Вычислите первый столбец прямоугольной карты в вашей системе координат , затем вычтите его из координаты столбца, чтобы определить, куда он попадает в массив. Это работает и для отрицательных координат столбца.
Выполните преобразование в получателе и установщике для карты, с чем-то вроде этого:
Вы должны будете изменить это, чтобы работать с вашим выбором координат и карты (обратите внимание на одно отличие). В некоторых макетах вы хотите сместить столбцы по строке, а не наоборот.
Вы можете использовать тот же трюк для создания карт других форм; это не ограничено прямоугольниками.
Если вы используете C или C ++, вы можете использовать арифметику указателей, чтобы сделать это быстрее. Вместо того, чтобы хранить массив указателей на массивы, сохраняйте массив указателей, которые были изменены
first_column_in_row
. (Это не может быть портативным)источник
yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)
некоторых пробах и ошибках. Понятия не имею, как это работает жестко.yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)
. x / 2 - это все целочисленные значения между прочим, так что нет необходимости в полу.Лично я предпочел бы простоту экономии памяти. Не оптимизируйте, пока не понадобится!
Если вы все еще хотите сэкономить несколько байтов, вот как вы можете это сделать:
Код Python для отображения координат прямоугольника на координаты параллелограмма и обратно:
источник
offsetY = Math.floor ( (x+1)/2 )
Нет необходимости искажать карту, поскольку преобразование между прямоугольными и «каноническими» координатами происходит быстро и просто. Вот ссылка на введение о том, как это сделать:
Преобразование между прямоугольными и каноническими шестнадцатеричными координатами
Этот метод сочетает в себе ленивую оценку с кэшированием рассчитанных конверсий.
источник