Недавно я объяснял дочке что такое четырехмерное пространство. Рассказывал, в том числе, про 4d куб. После моих не очень внятных объяснений она спросила: "А ты можешь сделать так, чтобы он вращался?". В этом месте я поймал себя на мысли, что не могу себе этого представить. Конечно, я понимаю, что спроецировать можно все на все, в том числе, 4d пространство на плоскость. Завращать тоже можно все, даже в 4d. Но тем не менее, представить, как будет вращаться эта штука я не мог. Кроме того, я не очень понимал, как сделать перспективу. Короче, на разбирательство ушла пара часов и еще несколько часов собственно на написание скрипта. По ходу возникла забавная подзадача. Вот какая. Рисовать гиперкуб я решил одним росчерком, с помощью svg-элемента <path>. Поскольку в каждой вершине сходится четное количество ребер (по 4), это можно сделать, пройдя по каждому ребру ровно по разу. Но вот как? Пройти по каждой вершине по разу --- просто. А именно, каждая вершина естественно нумеруется двоичным числом, и номера соседних вершин отличаются в одном бите. Поэтому задачу решает так называемый код Грея, который легко построить. Мою же задачу комбинация двух таких кодов не решила, так что в конце концов я просто нарисовал в inkscape граф и вручную его обошел по следующему пути:
0,1,5,13,15,14,6,2,3,11,10,8,9,1,3,7,15,11,9,13,12,14,10,2,0,4,6,7,5,4,12,8,0.
Ну да ладно, хватит трепаться, вот что у меня получилось:
Кривость куба --- следствие перспективы, как я ее понимаю.
PS Забавно, что, в отличии от 3d случая, картинка не обязана повторяться через конечное время.
PPS No SVG - no fun. IE отдыхает.
Конечно, таких демонстраций в сети можно нарыть вагон и маленькую тележку. Вот, например, можно самому повращать: http://www.cut-the-knot.org/ctk/Tesseract.shtml Там ещё рассказ про забавную формулу для параметров гиперкуба $(2x+1)^{n}$. Или вот есть пример с 3D эффектом http://dogfeathers.com/java/hypercube2-nogl.html
В заметке вообще ничего не понял: зачем нужен код Грея? Что значит, что вершина естественно нумеруется двоичным числом? Для кого естественным?
>В заметке вообще ничего не понял: зачем нужен >код Грея? Что значит, что вершина естественно >нумеруется двоичным числом? Для кого >естественным?
Ну, каждой размерности соответствует бит. Код Грея тогда позволяет пройти по ребрам, заходя в каждую вершину по разу. А нужно по два, поэтому естественно сначала обойти все вершины по разу, а потом еще по разу. Но такое, вроде невозможно, хотя это и удивительно.
Ну да, в смысле, он. На нем вообще редко что работает, но кубик крутится это да. Задал Александру Степановичу задачу про расстояние на параллелепипеде. Ещё думает.
Вот, кстати, то что два последовательных кода Грея никогда не дадут нужного результата — это очевидно. Потому что у тебя после первого прохода будут две вершины (начальная и конечная) куда ты заходил только по разу. Для того, чтобы оба прохода были правильным, надо чтобы первый заканчивался на вершине соседней с той с которой ты стартовал. После этого надо перейти на начальную. После этого второй тоже должен закончиться на вершине соседней с начальной. После этого надо снова перейти на начальную. Насколько я понял, твоя нумерация вершин это сделать позволяет, поскольку код Грея всегда заканчивается на соседней вершине от начальной. Ты, наверное, так и пробывал — и что, не получилось?
Код Грея так устроен, что первое и последнее число тоже отличаются в одном бите, так что под одним проходом я понимаю проход по всем вершинам и возврат в начальную. Так вот забавно, что второй раз я пройти не смог.
А, я понял, ты про нумерацию вершин не понял? Все просто: если записать номер вершины в двоичном виде (старшие разряды дополнить нулями, так чтобы всего было 4 разряда) и разделить запятыми, получишь координаты этой вершины.
Конечно, таких демонстраций в сети можно нарыть вагон и маленькую тележку. Вот, например, можно самому повращать: http://www.cut-the-knot.org/ctk/Tesseract.shtml Там ещё рассказ про забавную формулу для параметров гиперкуба $(2x+1)^{n}$. Или вот есть пример с 3D эффектом http://dogfeathers.com/java/hypercube2-nogl.html
ОтветитьУдалитьВ заметке вообще ничего не понял: зачем нужен код Грея? Что значит, что вершина естественно нумеруется двоичным числом? Для кого естественным?
>В заметке вообще ничего не понял: зачем нужен
ОтветитьУдалить>код Грея? Что значит, что вершина естественно
>нумеруется двоичным числом? Для кого
>естественным?
Ну, каждой размерности соответствует бит. Код Грея тогда позволяет пройти по ребрам, заходя в каждую вершину по разу. А нужно по два, поэтому естественно сначала обойти все вершины по разу, а потом еще по разу. Но такое, вроде невозможно, хотя это и удивительно.
А полином красив, только я бы его писал как $(2+x)^n$, тогда коэффициенты показывают число, а степени --- размерности элементов.
ОтветитьУдалитьКстати, с его помощью можно вычислить число элементов в нецелой размерности ;)
ОтветитьУдалитьА для симплекса соответствующая формула выглядит как $((1+x)^{n+1}-1)/x$
ОтветитьУдалитьЭтот комментарий был удален администратором блога.
ОтветитьУдалитьНу Гриша,Гриша, написано же, школьникам. Айфон надо говорить, Айфон.
ОтветитьУдалитьНу да, в смысле, он. На нем вообще редко что работает, но кубик крутится это да. Задал Александру Степановичу задачу про расстояние на параллелепипеде. Ещё думает.
ОтветитьУдалитьВот, кстати, то что два последовательных кода Грея никогда не дадут нужного результата — это очевидно. Потому что у тебя после первого прохода будут две вершины (начальная и конечная) куда ты заходил только по разу. Для того, чтобы оба прохода были правильным, надо чтобы первый заканчивался на вершине соседней с той с которой ты стартовал. После этого надо перейти на начальную. После этого второй тоже должен закончиться на вершине соседней с начальной. После этого надо снова перейти на начальную. Насколько я понял, твоя нумерация вершин это сделать позволяет, поскольку код Грея всегда заканчивается на соседней вершине от начальной. Ты, наверное, так и пробывал — и что, не получилось?
ОтветитьУдалитьКод Грея так устроен, что первое и последнее число тоже отличаются в одном бите, так что под одним проходом я понимаю проход по всем вершинам и возврат в начальную. Так вот забавно, что второй раз я пройти не смог.
ОтветитьУдалитьА, я понял, ты про нумерацию вершин не понял?
ОтветитьУдалитьВсе просто: если записать номер вершины в двоичном виде (старшие разряды дополнить нулями, так чтобы всего было 4 разряда) и разделить запятыми, получишь координаты этой вершины.
Я усё понял, я так и написал. Ещё у себя написал.
ОтветитьУдалить