Перемещение шестиугольников с координатами куба в квадратную формацию - PullRequest
1 голос
/ 16 июня 2019

Для большей части работает:

working

Проблема начинается, когда высота намного больше ширины (3x9, 3x11, 5x11 и т. Д.)

not working correctly

Как вы видите, первая строка не на своем месте, дальнейшее увеличение высоты будет повторять этот паттерн.

Вот код (Примечание: мои z и y для координат куба поменялись местами):

void SpawnHexGrid(int Width, int Height)
    {
        int yStart = -Height / 2;
        int yEnd = yStart + Height;

        for (int y = yStart; y < yEnd; y++)
        {
            int xStart = -(Width + y) / 2;
            int xEnd = xStart + Width;

            if (Width % 2 == 0)
            {
                if (y % 2 == 0)
                {
                    xStart++;
                }
            }
            else
            {
                if (y % 2 != 0)
                {
                    xStart++;
                }
            }
            Debug.Log("y: " + y + " , Start: " + xStart + " , End: " + xEnd);

            for (int x = xStart; x < xEnd; x++)
            {
                SetHexagon(new Cube(x, y));
            }
        }
    }

Edit:

После перехода на решение @Idle_Mind моя сетка выглядит следующим образом:

enter image description here

Редактировать снова:

Я нашел решение, после перехода на решение @ Idle_Mind исправил наклон, снова используя y:

int xStart = -Width / 2 - (y / 2);

но это вызвало такую ​​же проблему, как и раньше, но на этот раз я понял, что это как-то связано с округлением целого числа int, когда y отрицательно, xStart будет на 1 ниже ожидаемого, поэтому я просто добавляю 1 всякий раз, когда y отрицательна:

int add = 0;

    if (y < 0)
    {
        add = 1;
    }
    int xStart = -Width / 2 - ((y - add) / 2);

Теперь это работает как шарм, спасибо всем.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Измените SpawnHexGrid () на:

void SpawnHexGrid(int Width, int Height)
{
    int xStart = -Width / 2;
    int yStart = -Height / 2;
    int yEnd = yStart + Height;

    for (int y = yStart; y < yEnd; y++)
    {
        int xEnd = xStart + Width + (y%2==0 ? 0 : -1);

        for (int x = xStart; x < xEnd; x++)
        {
            SetHexagon(new Cube(x, y));
        }
    }
}

Моя тестовая установка:

enter image description here

---------- РЕДАКТИРОВАТЬ ----------

Я не понимаю, почему вы используете значение y в качестве части вычисления x.Сделайте константу x для всего столбца, как вы ожидаете для обычной сетки.В моем коде более короткие строки все еще начинаются с координат SAME x как более длинные;их длина меняется.Затем, , когда вы рисуете , я просто вычисляю положение для нормальной сетки, но добавляю половину ширины шестиугольника для всех нечетных y-позиций, что приводит к смещению, необходимому для шестиугольников.

Например, здесь сетка 5x5 нарисована "нормально" без смещения нечетных Y строк.Ясно, что начальная координата X для всех строк одинакова: enter image description here

Таким образом, сохраненные координаты x, y основаны на нормальной сетке, но код чертежа смещаетнечетные у строк.Вот где я изменяю координату X, только для рисования , нечетных строк y:

if (pt.Y % 2 != 0)
{
    center.Offset(Width / 2, 0);
}

Итак, после добавления смещения (опять же, только во время рисования) для нечетного Yстроки теперь выглядят так:

enter image description here

А вот сетка, показывающая внутренние координаты каждого отображаемого шестиугольника:

enter image description here

Надеюсь, это прояснит, как я подошел к нему.

1 голос
/ 16 июня 2019

Я полагаю, что вы просто чередуете другой размер строки для шестиугольной карты.Если так, то вот так должно работать:

class Program
{
    static void Main(string[] args)
    {
        const int Height = 4;
        const int Width = 4;

        for (int y = 0; y < Height; ++y)
        {
            int rowSize = y % 2 > 0 ? Width + 1 : Width;

            for (int x = 0; x < rowSize; ++x)
            {
                Console.WriteLine($"{x}:{y}");
            }
        }

        Console.ReadLine();
    }
}
...