У меня есть геометрический узор — скажем, крест:
Что я хочу повторить с некоторым перекрытием и плиткой… легко:
Синий квадрат отмечает плитку размером 100×100 пикселей.
Однако здесь возникает загвоздка: я хочу повернуть изображение примерно на 30°, а затем разбить его на мозаику. Это оказалось на удивление трудным; конечно, повернуть изображение легко, но найти перпендикулярную единичную плитку (синий блок на изображении выше) не так-то просто:
Ясно, что тайл 100×100 не подойдет. Как выбрать правильную плитку юнитов? Позиция предположительно не имеет значения, важен только размер, но я не знаю, как это вычислить. Интуитивно я ожидаю, что угол поворота и скалярное произведение будут сильно отличаться, но это то, что я получил 1 . Что еще хуже, поворот для произвольных углов не является точным из-за присущей дискретности пикселей, поэтому даже если я вычислю математически правильный размер, это не обязательно приведет к бесшовной плитке.
Итак, как я могу рассчитать оптимальную комбинацию угла/размера, учитывая размер перпендикулярной элементарной ячейки (здесь 100×100) и приблизительный желаемый угол?
1 Я думал, что (используя обозначения Википедии), поскольку мы хотим, чтобы проекция A на B была такой же длины, как B, мы имеем |B|=|A|·cosϑ, и, таким образом, |A|=|B|/cosϑ . Что, в моем случае, дало бы новую длину |A|=115,470, но простая попытка показывает, что это не может быть правильным с большой вероятностью, помимо получения уродливого нецелого числа. На самом деле, просто взглянув на приведенное выше повернутое изображение, мы можем увидеть, что все изображение размером 200×400 не содержит повторяющихся перпендикулярных единиц.
Я нашел это, что может помочь: Создание повернутых мозаичных шаблонов.
Как вы упомянули, здесь задействована математика, которая находится далеко за пределами моего понимания, поэтому я приведу только некоторые принципы, имеющие отношение к ее разработке.
В принципе, «решение» будет:
На изображении ниже показана повернутая текстура, которая была сформирована путем наложения исходного неповернутого узора на мозаику, а затем поворота полученной мозаики. Основной невращающийся тексель выделен и имеет ширину w и высоту h. Угол поворота — это острый угол, образованный линией w с горизонтом:
Поскольку нам нужны острые углы, если вы вращаетесь в другом направлении, то схема выше выглядит так:
Размер изображения (w' x h'), необходимый для того, чтобы сделать текстуру мозаичной, можно найти следующим образом:
Объяснение продолжается немного больше, поэтому, если вы нашли его полезным, не стесняйтесь редактировать ответ (или опубликовать новый).
Вот нематематический подход, когда мне нужно было делать подобные вещи:
Теперь у вас есть то, что должно быть 4-строчным прямоугольником вокруг наименьшей возможной плитки (опять же, она не будет маленькой).
Затем есть немного разочаровывающих проб и ошибок, чтобы сделать его идеальным в пикселях, и тогда вы должны быть готовы к работе.
джуджа