Распределение углов в ромбах в одном 1:4, 36°:144°, в другом 2:3, 72°:108°. Углы в ромбах кратны одной десятой полного разворота, 36°.
Определим координаты углов правильного десятиугольника.
градус | cos | sin |
---|---|---|
0 | 1 | 0 |
36 | 0,809017 | 0,587785 |
72 | 0,309017 | 0,951056 |
Остальные симметрично, меняется только знак.
Сразу заметно, что косинусы углов 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 |
И значит, существует целочисленная система координат.
Коэффициенты попарно различаются на один и тот же множитель, это коэффициент золотого сечения.
Можно вывести точное представление для коэффициентов.
Дальше магия золотого сечения:
Отсюда множество закономерностей:
Тривиальные:
Из-за равенства отношения коэффициентов:
Квадраты коэффициентов:
Произведение:
Исходя из этих свойств можно составить матрицу для целочисленного умножения векторов:
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 типа, а к координатной системе принадлежат точки исключительно при их правильной комбинации.
Для приближения к произвольной точке нужно разложить каждую координату на подходящие целые множители, учитывая при этом групповую четность.
В общем, существует система координат, которая совмещает целое значение координат и повороты в 36°. Когда я её вывел, был удивлён, что не знал о ней раньше. Но теперь о ней есть статья на Хабре.
Комментарии (16)
gimntut
17.11.2017 05:23Особенность этой координатной системы в том, что она покрывает всю плоскость с любой заданной точностью.
Всё время речь о целых числах и вдруг любая точность. Т.е. возможна точность 1e-6. Но как это стыкуется с целыми числами?
yurixi Автор
17.11.2017 06:00Например, точка {1346269,-2178309,0,0} находится на плоскости в (2,05124е-7;0)
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.gimntut
17.11.2017 07:47Правильно ли я понимаю, что преобразование декартовых координат в "золотые" такая же тривиальная задача, как обратная операция?
yurixi Автор
17.11.2017 08:36Нет, для многих точек нужно подбирать ближайшие с приемлемой точностью.
например, точку (0,5;0) нельзя отобразить в золотую систему, так как {1,0,0,0} не подходит по чётности.
claygod
17.11.2017 08:07Можете сформулировать, какие преимущества есть у этой системы координат по сравнению с другими?
yurixi Автор
17.11.2017 08:23Для отображения мозаики Пенроза при расчетах координат использовались только целые числа, не накапливалась ошибка плавающих чисел.
Думаю, координатная система, в которой можно отображать пятиконечные звёзды с абсолютной точностью может иметь и другие преимущества.claygod
17.11.2017 08:44Думаю, координатная система, в которой можно отображать пятиконечные звёзды с абсолютной точностью может иметь и другие преимущества.
Ну, это для политиков ))
Для отображения мозаики Пенроза при расчетах координат использовались только целые числа, не накапливалась ошибка плавающих чисел.
Только целые числа — это ок.
На википедии есть статья, посвященная Мозаике Пенроуза. Там написано, что есть три мозаики Пенроуза (вы описали Р3), мне показалась интересной и версия на дельтоидах.
Думаю, практически мозаики такого рода можно применять в остеклении фасадов, это весьма изменит облик здания.Foxbator
17.11.2017 09:38Статья про использование апериодических мозаик дреними исламскими мастерами. http://www.membrana.ru/particle/628
Bookvarenko
17.11.2017 11:54Осталось запилить движок игровой со спрайтами и кватернионами. Утащил статью в закрома.
dcc0
18.11.2017 10:05Извиняюсь за небольшой оффтоп.
Мне интересно, насколько тривиальной считается матрица поворота? Ее простейший случай.
Имеет ли смысл написать статейку на Хабр «О матрице поворота простыми словами».
Или это достаточно просто, чтобы об этом целую статью писать?Bookvarenko
19.11.2017 12:30Товарищ, пиши конечно. Про матрицы поворотов и другие преобразования. Никак они в ум не заходят заразы, я уже столько про них перечитал. Хочу для двухмерного движка наколхозить модуль отображения равноугольных и кубических панорам и застреваю на математике. Равноугольные-то поддались, а кубические вводят в ступор.
dcc0
Правильно ли я понял, что при повороте базиса точки, имеющие целочисленные координаты — сохранят целочисленные кординаты?
yurixi Автор
Да. Сам поворот может производиться целочисленным умножением.