Матрицы и сгенерированный плиточный мир, как генерировать края?

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

Я хочу создать края моего плиточного мира. У меня есть основные 8 ребер. У меня есть массив целых, которые представляют мои плитки. 0 — это вода, а 1 — трава. Я хотел бы добавить свои края, которые переходят между водой и травой. Мои края от 10 до 17.

int edges[3][3] =
{
{10, 11, 12},
{13,  0, 14},
{15, 16, 17}
};

Первое, что я думаю, это то, что это напоминает матрицы. Я знаю, что у меня есть объект матрицы 3 на 3 с моей графической библиотекой. Существуют ли какие-либо стандартные операции с матрицами или масками для умного применения моих ребер к моим плиткам?

Существует ли стандартная формула для объединения ребер? Например, если нижний правый перекрывается с плиткой травы, возможно, я бы просто не изменил ее значение, однако, если нижний правый перекрывается с левой верхней частью, я хочу изменить эту плитку на траву (0). Есть еще много отдельных сценариев, и проблема становится сложной.

Поскольку для добавления ребер при генерации плиток травы потребовалось бы использовать функцию предварительного просмотра, поэтому мои ребра генерируются в качестве дополнительного анализа массива плиток. Поэтому я ищу решение, в котором я могу добавить края к краям моих травяных пятен.

Это также напоминает мне о сглаживании, интересно, есть ли соответствующая формула в этой области.

В идеале решение будет оптимальным. Например, у меня была бы какая-то маска, подобная приведенной выше, и, добавив ее к каждой плитке травы в массиве, я бы затем получил уникальные значения для углов и сторон, чтобы я мог преобразовать их в граничные изображения.

0

Решение

Сначала различайте логику и визуализацию. Вероятно, имеет смысл иметь массив, в котором каждая ячейка является либо травой, либо водой для логики игры (назовем ее a). Исходя из этого, вы создаете второй массив для хранения визуализации этой ячейки и рассмотрения ребер (давайте назовем этот v).


Вычислить v от a Вы можете посмотреть на проблему так: для каждой клетки v_ij в v Вы хотите вычислить, как сделать это в зависимости от a_ij и значения из соседних ячеек.

Пример:

Тезисы являются значения в a:

0 0 0
1 0 0
1 1 1

Как бы вы сделали клетку посередине?

Без учета симметрии вы на самом деле 2^8=256 разные случаи.


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

Вы можете получить индекс в этой таблице поиска, пройдя через 8 ячеек, получив 8 раз 0 или 1 и установив его как биты целого числа без знака.

В приведенном выше примере вы, например, получите 000 100 111 = 39Итак, 39-я запись в вашем поиске.

1

Другие решения


По вопросам рекламы [email protected]