Я предполагаю, что это достаточно распространенная проблема, и прошу найти решение, которое могло бы быть более академическим по своему характеру или общим уравнением, используемым для общих проблем, подобных этой, как и мне, взламывая то, что выглядит очень большим беспорядком спагетти.
Я хочу создать края моего плиточного мира. У меня есть основные 8 ребер. У меня есть массив целых, которые представляют мои плитки. 0 — это вода, а 1 — трава. Я хотел бы добавить свои края, которые переходят между водой и травой. Мои края от 10 до 17.
int edges[3][3] =
{
{10, 11, 12},
{13, 0, 14},
{15, 16, 17}
};
Первое, что я думаю, это то, что это напоминает матрицы. Я знаю, что у меня есть объект матрицы 3 на 3 с моей графической библиотекой. Существуют ли какие-либо стандартные операции с матрицами или масками для умного применения моих ребер к моим плиткам?
Существует ли стандартная формула для объединения ребер? Например, если нижний правый перекрывается с плиткой травы, возможно, я бы просто не изменил ее значение, однако, если нижний правый перекрывается с левой верхней частью, я хочу изменить эту плитку на траву (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-я запись в вашем поиске.