В одной из мозаик Пенроуза используются всего два ромба, отличающиеся углами. Из этих элементов можно выстроить апериодическую мозайку любых размеров. Для её отображения я попробовал представить координаты аналитически.

image

Распределение углов в ромбах в одном 1:4, 36°:144°, в другом 2:3, 72°:108°. Углы в ромбах кратны одной десятой полного разворота, 36°.

Определим координаты углов правильного десятиугольника.

градус cos sin
0 1 0
36 0,809017 0,587785
72 0,309017 0,951056


image

Остальные симметрично, меняется только знак.

Сразу заметно, что косинусы углов 36° и 72° отличаются на 0,5. И это очень многозначительный факт!

Абсолютных значений координат ровно три штуки — и для координат абсциссных и для ординатных. Все три могут быть представлены как два коэффициента с целыми множителями.

Для абсциссных координат это просто: среди значений ноль, который представлен нулевыми множителями. Среди ординатных координат третья — единица — не соразмерна остальным двум. Но, так как разница координат это 0,5, то эта разница может стать одним из коэффициентов, а второй коэффициент будет меньшим значением. Значение 1 получится множителем 2.

*36° x y
Cxa=0,5 Cxb=0,309017 Cya=0,951056 Cxb=0,587785
0 2 0 0 0
1 1 1 0 1
2 0 1 1 0
3 0 -1 1 0
4 -1 -1 0 1
5 -2 0 0 0
6 -1 -1 0 -1
7 0 -1 -1 0
8 0 1 -1 0
9 1 1 0 -1


И значит, существует целочисленная система координат.

$\{x_1,x_2,y_1,y_2\}=(C_{xa}x_1+C_{xb}x_2,C_{ya}y_1+C_{yb}y_2)$

image

Коэффициенты попарно различаются на один и тот же множитель, это коэффициент золотого сечения.

$C_{xb} = \varphi C_{xa}$

$C_{yb} = \varphi C_{ya}$

$\varphi = \frac{\sqrt{5} - 1}{2}$

Можно вывести точное представление для коэффициентов.

$C_{xa} = \frac{1}{2}$

$C_{xb} = \frac{\varphi}{2}$

$C_{ya} = \frac{\sqrt{3 + \varphi}}{2}$

$C_{yb} = \frac{\sqrt{2 - \varphi}}{2}$

Дальше магия золотого сечения:

$\\\varphi^2 = 1-\varphi$

$\\(a+b\varphi)\cdot\varphi=a\cdot\varphi+b(1-\varphi)=b+(a-b)\varphi$

$\\(a+b\varphi)/\varphi=(b-a)+a\varphi$

$\\(3+\varphi)(2-\varphi)=6+2\varphi-3\varphi-\varphi^{2}=6-\varphi-(1-\varphi)=5$

Отсюда множество закономерностей:

Тривиальные:

$C_{xa} \cdot C_{xa} = C_{xa} / 2$
$C_{xa} \cdot C_{xb} = C_{xb} / 2$
$C_{xa} \cdot C_{ya} = C_{ya} / 2$
$C_{xa} \cdot C_{yb} = C_{yb} / 2$

Из-за равенства отношения коэффициентов:

$C_{xb} \cdot C_{ya} = \varphi \cdot C_{xa} \cdot C_{ya} = \varphi \cdot C_{ya} / 2 = C_{yb} / 2$
$C_{xb} \cdot C_{yb} = \varphi \cdot C_{xa} \cdot \varphi \cdot C_{ya} = (1 - \varphi) \cdot C_{ya} / 2 = (C_{ya} - C_{yb}) / 2$

Квадраты коэффициентов:

$C_{xb} \cdot C_{xb} = (1 - \varphi) / 4 = (C_{xa} - C_{xb}) / 2$
$C_{ya} \cdot C_{ya} = (3 + \varphi) / 4 = (3 C_{xa} + C_{xb}) / 2$
$C_{yb} \cdot C_{yb} = (2 - \varphi) / 4 = (2 C_{xa} - C_{xb}) / 2$

Произведение:

$C_{ya} \cdot C_{yb} = \sqrt{(3 + \varphi)(2 - \varphi)}/4 = \sqrt{5} / 4 = (1 + 2 \varphi) / 4 = (C_{xa} + 2 C_{xb}) / 2$

Исходя из этих свойств можно составить матрицу для целочисленного умножения векторов:

const crd vmul[16] = {
{ 1, 0, 0, 0}, { 0, 1, 0, 0}, { 0, 0, 1, 0}, { 0, 0, 0, 1}, 
{ 0, 1, 0, 0}, { 1,-1, 0, 0}, { 0, 0, 0, 1}, { 0, 0, 1,-1}, 
{ 0, 0, 1, 0}, { 0, 0, 0, 1}, {-3,-1, 0, 0}, {-1,-2, 0, 0}, 
{ 0, 0, 0, 1}, { 0, 0, 1,-1}, {-1,-2, 0, 0}, {-2, 1, 0, 0}
};

И всё перемножение сведётся к

int* vm = (int*)vmul;
for(int i = 0; i < 4; i++) 
  for(int j = 0; j < 4; j++) 
    for(int k = 0; k < 4; k++)
      v3[k] += v1[i] * v2[j] * vm[(i * 4 + j) * 4 + k];

Векторная единица в этой системе выражается как {2,0,0,0}. После простого переменожения таких единиц мы получим {4,0,0,0}. Так что, деление на два, которое было в каждой формуле для коэффициентов, производится отдельно, как нормировка:

for(int i = 0; i < 4; i++) v3[i] /= 2;

Особенность этой координатной системы в том, что она покрывает всю плоскость с любой заданной точностью. Можно повторять любое количество шагов, выбирая любое из десяти направлений и всё равно оставаться в целочисленных координатах.

Но не все сочетания координат определяют место, достижимое из начального положения.

Для одного шага разложения по координатам следующие: {2,0,0,0}, {1,1,0,1}, {0,1,1,0}, {0,-1,1,0}, {-1,-1,0,1}, {-2,0,0,0}, {-1,-1,0,-1}, {0,-1,-1,0}, {0,1,-1,0}, {1,1,0,-1}. Любая комбинация этих шагов допустима.

Вместе с единичным шагом {2,0,0,0} сочетания
{0,1,1,0} – {0,1,-1,0} = {0,0,2,0},
{1,1,0,1} – {1,1,0,-1} = {0,0,0,2},
{1,1,0,1} + {1,1,0,-1} – {2,0,0,0} = {0,2,0,0}
означают, что любую отдельную координату можно сдвинуть на 2, и значит, на достижимость влияет только групповая четность координат. Достижимых сочетаний получается четыре: нулевая: {0,0,0,0}, от одиночных шагов: {1,1,0,1}, {0,1,1,0}, и их комбинация: {1,0,1,1}.

Как видно, групповая четность абциссных координат однозначно взаимосвязана c групповой четностью ординатных координат. Это значит, что вертикальные координаты делятся на четыре типа, горизонтальные координаты тоже делятся на 4 типа, а к координатной системе принадлежат точки исключительно при их правильной комбинации.

image


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

В общем, существует система координат, которая совмещает целое значение координат и повороты в 36°. Когда я её вывел, был удивлён, что не знал о ней раньше. Но теперь о ней есть статья на Хабре.

$\frac{{\displaystyle\frac{5-\sqrt5}{5+\sqrt5}}-\sqrt{\displaystyle\frac{5+\sqrt5}{5-\sqrt5}}}{\displaystyle\frac{5+\sqrt5}{5-\sqrt5}+\sqrt{\frac{5-\sqrt5}{5+\sqrt5}}}+\frac{5-\sqrt5}{5+\sqrt5}=0$



$\frac{5-\sqrt5}{5+\sqrt5}+\sqrt{\frac{5-\sqrt5}{5+\sqrt5}}\overset1=\frac{5+\sqrt5}{5-\sqrt5}-\sqrt{\frac{5+\sqrt5}{5-\sqrt5}}$

Комментарии (16)


  1. dcc0
    16.11.2017 21:38
    +1

    В общем, существует система координат, которая совмещает целое значение координат и повороты в 36°

    Правильно ли я понял, что при повороте базиса точки, имеющие целочисленные координаты — сохранят целочисленные кординаты?


    1. yurixi Автор
      17.11.2017 04:28

      Да. Сам поворот может производиться целочисленным умножением.


  1. gimntut
    17.11.2017 05:23

    Особенность этой координатной системы в том, что она покрывает всю плоскость с любой заданной точностью.

    Всё время речь о целых числах и вдруг любая точность. Т.е. возможна точность 1e-6. Но как это стыкуется с целыми числами?


    1. yurixi Автор
      17.11.2017 06:00

      Например, точка {1346269,-2178309,0,0} находится на плоскости в (2,05124е-7;0)


    1. yurixi Автор
      17.11.2017 07:36

      Например, точка {2692538,-4356618,0,0} находится на плоскости в (2,05124e-07;0).

      При сложении единичных шагов 72° {0,1,1,0} и 108° {0,-1,1,0} получится вектор {0,2,0,0} который направлен как единичный вектор {2,0,0,0}, но меньше по длине.
      При умножении {0,2,0,0} на {0,2,0,0} получится {2,-2,0,0}, он ещё меньше по длине.
      Так можно дойти до {2692538,-4356618,0,0}, по длине 2,05124e-07.


      1. gimntut
        17.11.2017 07:47

        Правильно ли я понимаю, что преобразование декартовых координат в "золотые" такая же тривиальная задача, как обратная операция?


        1. yurixi Автор
          17.11.2017 08:36

          Нет, для многих точек нужно подбирать ближайшие с приемлемой точностью.
          например, точку (0,5;0) нельзя отобразить в золотую систему, так как {1,0,0,0} не подходит по чётности.


  1. claygod
    17.11.2017 08:07

    Можете сформулировать, какие преимущества есть у этой системы координат по сравнению с другими?


    1. yurixi Автор
      17.11.2017 08:23

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

      Думаю, координатная система, в которой можно отображать пятиконечные звёзды с абсолютной точностью может иметь и другие преимущества.


      1. claygod
        17.11.2017 08:44

        Думаю, координатная система, в которой можно отображать пятиконечные звёзды с абсолютной точностью может иметь и другие преимущества.

        Ну, это для политиков ))

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

        Только целые числа — это ок.

        На википедии есть статья, посвященная Мозаике Пенроуза. Там написано, что есть три мозаики Пенроуза (вы описали Р3), мне показалась интересной и версия на дельтоидах.

        Думаю, практически мозаики такого рода можно применять в остеклении фасадов, это весьма изменит облик здания.


        1. Foxbator
          17.11.2017 09:38

          Статья про использование апериодических мозаик дреними исламскими мастерами. http://www.membrana.ru/particle/628


  1. Satim
    17.11.2017 08:21

    Спасибо, очень интересная статья.


  1. Bookvarenko
    17.11.2017 11:54

    Осталось запилить движок игровой со спрайтами и кватернионами. Утащил статью в закрома.


  1. 027
    17.11.2017 16:46
    +2

    мозайку

    :)


  1. dcc0
    18.11.2017 10:05

    Извиняюсь за небольшой оффтоп.
    Мне интересно, насколько тривиальной считается матрица поворота? Ее простейший случай.
    Имеет ли смысл написать статейку на Хабр «О матрице поворота простыми словами».
    Или это достаточно просто, чтобы об этом целую статью писать?


    1. Bookvarenko
      19.11.2017 12:30

      Товарищ, пиши конечно. Про матрицы поворотов и другие преобразования. Никак они в ум не заходят заразы, я уже столько про них перечитал. Хочу для двухмерного движка наколхозить модуль отображения равноугольных и кубических панорам и застреваю на математике. Равноугольные-то поддались, а кубические вводят в ступор.