Не простая координатная система, а золотая

в 13:35, , рубрики: визуализация данных, золотое сечение, математика, мозайка пенроуза

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

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

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

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

image

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

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

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

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

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

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

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

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

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

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

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

$inline$\(a+bvarphi)cdotvarphi=acdotvarphi+b(1-varphi)=b+(a-b)varphi$inline$

$inline$\(a+bvarphi)/varphi=(b-a)+avarphi$inline$

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

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

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

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

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

$inline$C_{xb} cdot C_{ya} = varphi cdot C_{xa} cdot C_{ya} = varphi cdot C_{ya} / 2 = C_{yb} / 2$inline$
$inline$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$inline$

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

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

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

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

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

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°. Когда я её вывел, был удивлён что не знал о ней раньше. Но теперь о ней есть статья на Хабре.

$$display$$frac{{displaystylefrac{5-sqrt5}{5+sqrt5}}-sqrt{displaystylefrac{5+sqrt5}{5-sqrt5}}}{displaystylefrac{5+sqrt5}{5-sqrt5}+sqrt{frac{5-sqrt5}{5+sqrt5}}}+frac{5-sqrt5}{5+sqrt5}=0$$display$$

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

Автор: Юрий

Источник

Поделиться

* - обязательные к заполнению поля