четверг, 3 февраля 2011 г.

4d куб

Недавно я объяснял дочке что такое четырехмерное пространство. Рассказывал, в том числе, про 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 отдыхает.

12 комментариев:

  1. Конечно, таких демонстраций в сети можно нарыть вагон и маленькую тележку. Вот, например, можно самому повращать: http://www.cut-the-knot.org/ctk/Tesseract.shtml Там ещё рассказ про забавную формулу для параметров гиперкуба $(2x+1)^{n}$. Или вот есть пример с 3D эффектом http://dogfeathers.com/java/hypercube2-nogl.html

    В заметке вообще ничего не понял: зачем нужен код Грея? Что значит, что вершина естественно нумеруется двоичным числом? Для кого естественным?

    ОтветитьУдалить
  2. >В заметке вообще ничего не понял: зачем нужен
    >код Грея? Что значит, что вершина естественно
    >нумеруется двоичным числом? Для кого
    >естественным?

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

    ОтветитьУдалить
  3. А полином красив, только я бы его писал как $(2+x)^n$, тогда коэффициенты показывают число, а степени --- размерности элементов.

    ОтветитьУдалить
  4. Кстати, с его помощью можно вычислить число элементов в нецелой размерности ;)

    ОтветитьУдалить
  5. А для симплекса соответствующая формула выглядит как $((1+x)^{n+1}-1)/x$

    ОтветитьУдалить
  6. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  7. Ну Гриша,Гриша, написано же, школьникам. Айфон надо говорить, Айфон.

    ОтветитьУдалить
  8. Ну да, в смысле, он. На нем вообще редко что работает, но кубик крутится это да. Задал Александру Степановичу задачу про расстояние на параллелепипеде. Ещё думает.

    ОтветитьУдалить
  9. Вот, кстати, то что два последовательных кода Грея никогда не дадут нужного результата — это очевидно. Потому что у тебя после первого прохода будут две вершины (начальная и конечная) куда ты заходил только по разу. Для того, чтобы оба прохода были правильным, надо чтобы первый заканчивался на вершине соседней с той с которой ты стартовал. После этого надо перейти на начальную. После этого второй тоже должен закончиться на вершине соседней с начальной. После этого надо снова перейти на начальную. Насколько я понял, твоя нумерация вершин это сделать позволяет, поскольку код Грея всегда заканчивается на соседней вершине от начальной. Ты, наверное, так и пробывал — и что, не получилось?

    ОтветитьУдалить
  10. Код Грея так устроен, что первое и последнее число тоже отличаются в одном бите, так что под одним проходом я понимаю проход по всем вершинам и возврат в начальную. Так вот забавно, что второй раз я пройти не смог.

    ОтветитьУдалить
  11. А, я понял, ты про нумерацию вершин не понял?
    Все просто: если записать номер вершины в двоичном виде (старшие разряды дополнить нулями, так чтобы всего было 4 разряда) и разделить запятыми, получишь координаты этой вершины.

    ОтветитьУдалить
  12. Я усё понял, я так и написал. Ещё у себя написал.

    ОтветитьУдалить