|
Тело
массива зелено, вон еле завис самолет
(Визуализация информации)
Опубликовано в журнале Hard'n'nSoft №11 2001 |
— Какие чудные
цветы! — воскликнула Элли.
— Они хороши! — молвил Страшила. — Конечно,
будь
у меня мозги, я восхищался бы цветами больше, чем
теперь.
А. Волков. Волшебник Изумрудного города
Чуть не начал шаблоном
“Проблема визуализации информации состоит в
…”, но призадумался на часок. Вся прелесть в том,
что проблемы как таковой и нет (жили же как-то
тысячи лет и еще проживем), а есть замечательная
возможность увидеть на экране модель какого-либо
процесса и использовать этот зрительный образ в
самых различных областях человеческой
деятельности, в том числе для развлечения
(кстати, предлагаю в процессе чтения решить
загадку: что это за чудная фраза вынесена в
заголовок и какое отношение имеет она к теме
статьи?). Однако о развлечениях после, пока
поговорим о серьезном. Еще лет пятнадцать назад
предлагалось заменить десятки мониторов, по
которым, например, диспетчер электростанции
следил за работой объекта, лицом девушки на
экране компьютера. Десятки параметров
технологического процесса увязывались
определенным образом с изменением мимики, а так
как лицо человека необычайно информативно, то
оно смогло бы “охватить” все возможные режимы
работы и “донести” их до диспетчера. Можно также
одну половину лица оставлять беспристрастным
эталоном, а менять только вторую — это, наверное,
более наглядно, но несколько не эстетично. Даже
если нарисовать примитивную рожицу по принципу
“точка, точка, запятая” и пробовать ее исказить,
то станет очевидно, что малейшее изменение не
только бросается в глаза, но и имеет
эмоциональную окраску. Неплохая забава:
составьте программу, рисующую примитивную
физиономию, меняйте случайным образом параметры
— и рожица оживет. Если в программе задать десять
параметров (лоб, глаза, скулы, губы и т.д.), каждый
из которых может принимать одно из десяти
значений, то мы получим возможность нарисовать 10
миллиардов различных портретов, что соизмеримо с
количеством людей, живших на Земле за все
обозримое время.
Если бы
комплимент, который кавалер преподносит своей
даме, был правдою, то это была бы просто
информация
Если информацию представить в
виде последовательности бит — нулей и единичек,
то один из способов “увидеть” ее состоит в
“замощении” экрана этакими плитками,
состоящими из двух четвертей круга в квадрате и
имеющими две различные ориентации. Если пришла
единичка, выбирается первая плитка, а если нуль,
то вторая. В итоге мы получим красивый узор с
шариками, гантельками, длинными коридорами и
лабиринтами. Не поверите, но узор от
упорядоченной информации, созданной человеком,
отличается от узора, сгенерированного
хаотическим шумом! Можно, конечно, придираться к
определению “упорядоченная информация”, к
субъективности оценки гармоничности картинки и
прочим мелочам, но “методика” предложена.
Подробнее об это модели читайте в статье "Бульон из информации". Кто знает,
может, именно она позволит обнаружить сигналы от
внеземных цивилизаций (интересно, какие у них там
понятия о гармонии?). Эта модель порождает
множество занимательных задач. Например, какова
доля одиночных шариков в общем числе плиток,
каких звеньев больше — двойных или тройных,
всегда ли можно найти “дорожку” от одного края
картинки к другому? Интересная забава —
рассматривать варианты соединений шариков.
Например, четырехзвенные цепочки могут быть
выполнены в виде линии или в виде, когда
четвертый шарик отходит от среднего из трех. Для
пятизвенных цепочек количество вариантов
возрастает, но вы их можете перебрать, рисуя
карандашом на бумаге. Очевидно, что с ростом
числа звеньев число вариантов резко
увеличивается. Редкие чудаки, любившие в школе
органическую химию, заметят здесь аналогию с
количеством вариантов комбинаций предельных
углеводов.
А еще представьте трехмерную модель таких
плиток. У кубика вырезаем сферические лунки на
некоторых вершинах и выкладываем такие кубики в
большой куб, например 5х5х5 кубиков. Будут ли у нас
туннели? Или замкнутые “внутренности”? Посидев
минут десять с умным видом, вы убедитесь, что
модель совсем не работает, т.к. вырезанные сферы
могут создавать только отдельные, не связанные
друг с другом пустоты. (Надеюсь, я ошибаюсь, и
кто-нибудь меня поправит). Зато работает другой
вариант: представьте, что от середины грани куба
проложена труба к середине смежной грани (внутри
куба, естественно). Сколько вариантов кубиков с
двумя трубками может существовать? Если мы снова
выложим куб 5х5х5 и в одно из верхних отверстий
начнем лить кока-колу, то заполним ли мы этим
божественным напитком все полости или он сразу
выльется в ближайшем выходе? И совсем сложный
вопрос для тех, у кого развито воображение:
соединим трубками середины смежных граней
ЧЕТЫРЕХМЕРНОГО куба. Сколько вариантов трубок
можно отвести от одной грани? (колу в такой куб
лучше не лить — затопим четвертое измерение,
неизвестно, где она вновь появится в нашем мире)
Дальнейшее развитие идея визуализации
информации за счет замощения плоскости плитками
получила в работах австралийского художника
Пола Брауна (Paul Brown), подробнее см. www.paul-brown.com/GALLERY/TIMEBASE/CHROMOS/INDEX.HTM
. Идея Брауна заключается в выборе на сторонах
квадрата не четырех, а восьми точек для
построения линий, по две точки на каждой стороне.
Когда дождетесь окончания загрузки модуля,
выполненного с помощью Macromedia Shockwave, то ахнете от
восторга: линии каждого квадрата, сливающиеся в
замысловатые узлы, периодически меняются,
заставляя всю картину выглядеть по-другому.
Попытайтесь написать программу, заполняющую
плоскость плитками Брауна с “червяками”,
которые соединяют то одну, то другую пару точек в
квадратах, оживляя картину. Попробуйте хотя бы на
бумаге нарисовать все варианты плиток Брауна, и
вы получите огромное удовольствие — кстати, их
не так уж и много, как кажется на первый
взгляд.
Если нумеровать квадратики, заполняющие
плоскость рядами, то номера, кратные какому-либо
числу, будут выстраиваться по прямым линиям. Вид
этих линий будет зависеть от числа, которому
задается кратность, и от количества квадратиков
в ряду. Можно попытаться раскрасить все числа,
кратные, например, семи, в красный цвет, пяти — в
синий и т.д. и полюбоваться узором кратности и
делимости чисел. Есть и более таинственные узоры:
если располагать числа подряд по
раскручивающейся спирали, то простые числа
расположатся вдоль прямых линий (т.н. скатерть
Улама). Мало кто знает, что если выписывать числа
по треугольной спирали, то простые числа тоже
ложатся на некоторые таинственные линии. Как
известно, теории простых чисел до сих пор не
существует, и их поиск сводится к
“неинтеллектуальному” перебору и проверки
делимости. У каждого есть шанс прославиться,
найдя новое простое число, их, даже не очень
больших, огромное множество. Если же вы делаете
первые шаги в программировании, то попробуйте
просто написать программу, располагающую
квадратики по спирали, — прекрасное упражнение с
получением удовольствия от созерцания
результата.
Когда все сказано и сделано, больше
сказано, чем сделано
Путешествуя по Сети, я попал на
страничку преподавателя математики и
программирования Университета в Сан-Хосе Руди
Руккера (Rudy Rucker) — www.mathcs.sjsu.edu/faculty/rucker
, где обнаружил программу Capow ( www.mathcs.sjsu.edu/capow ).
Перепишите и запустите ее! Это самая что ни на
есть визуализация информации, причем информации
аналоговой. К программе прилагается и
скринсейвер с множеством настроек. Установите
его, и вы навсегда забудете об остальных
хранителях экрана, ибо появляющаяся красотища
дает наслаждение, недостижимое с помощью других
программ, не говоря уже о реальной жизни. Можно
показывать или убирать синусоиды, можно
наблюдать сигнал в аналоговой или цифровой форме
и можно задать такой режим, чтобы пестрый ковер
“полз” по экрану или обновлялся, будучи
неподвижным, что тоже невероятно красиво. Из
множества остроумных и новаторских идей
программы нас более всего интересует
“разворачивание” синусоиды в цветной “ковер”.
И как это опять же я сам не додумался! Области
применения неограниченны. Ведь цветная
развертка на плоскость функции по времени скажет
намного больше, чем сама функция в виде линии.
Представьте, что вы получаете кардиограмму или
энцефалограмму в виде не пилообразного следа
самописца на миллиметровке, а многоцветного
узора, содержащего в сотни раз больше информации.
Опять же радиолюбители и схемотехники могут
визуально исследовать амплитудную, частотную и
фазовую модуляцию, их самые замысловатые
комбинации, подобрать и проверить эффект от
сочетания самых различных параметров
колебаний.
Можно даже сконструировать
детектор лжи, основанный на раскрашивании
колебаний голоса подозреваемого — при волнении
картинка наверняка резко изменится. Главное же
предназначение метода — выявить негативные
тенденции исследуемого процесса и, своевременно
вмешавшись, не дать ему дойти до кризисной точки.
Красочная картинка в виде меняющегося ковра
просто не имеет конкурентов в решении этой
задачи.
Мы, конечно, хотим иметь свою такую программу,
чтобы самим поиграть с ее параметрами. Поясню,
что основная идея состоит в том, чтобы точки на
плоскости закрашивать цветами в зависимости от
значения рассматриваемой функции. Функция
меняется во времени, создавая таким образом
цветной узор на ползущем “коврике”.
Поблагодарив мысленно авторов Capow, бросаемся в
бой. Политический лозунг прошлых лет “Нам Запад
не указ!” приводит не только к набиванию шишек на
ровном месте, но и рождает новые плодотворные
идеи. Сразу сталкиваемся с вопросом — как
связана функция с рисуемым ею цветом?
Первоначальная идея расположить по оси ординат
три зоны по 255 единиц для красного, зеленого и
синего (итого 255*3=765, поэтому при вычислении Y1
стоит множитель 383, чтобы амплитуда по модулю
дала вдвое больше) приводит к мутным и блеклым
“коврам”. Поэтому, проведя несколько часов в
поисках, привязываем цвета к координате Y через
синус, введя также случайный параметр b и для
сдвига фазы синего и зеленого относительно
красного цвета. Это дает возможность получать
яркие и резкие цвета. Функция, задаваемая в
строке, где вычисляется Y1, может иметь самые
фантастические “навороты”, мы же остановимся на
довольно скромном варианте, связанном с z, и fi и
зависящем от случайных параметров a и b.
Dim z As Integer, a As Integer, b As Integer
Private Sub Form_Load()
Randomize (Timer)
a = Int(Rnd * 3 + 2)
b = Int(Rnd * 4 + 2)
End Sub
Private Sub Часы1_Timer()
Line (0, 0)-(20, 50), RGB(190, 190, 190), BF
PSet (0, 0)
Print a
PSet (0, 20)
Print b
z = z + 1
For fi = 0 To 2 * 3.14159 Step 0.015
x = fi * 60
Y1 = 383 * (0.6 * Sin(a * fi) * Sin(z / 15) + 0.5 * Cos(b * fi) ^ a)
y = Y1 + 383
b1 = 0.01 * b * y
red = Abs(255 * Sin(b1))
green = Abs(255 * Sin(b1 + b))
blue = Abs(255 * Sin(b1 - b))
PSet (x + 50, z), RGB(red, green, blue)
Line (x + 50, z + 1)-(x + 50, z + 120), RGB(0, 0, 0), BF
'Line (50, z + 60)-(450, z + 60), RGB(0, 0, 0)Line (x + 50, z + 60 + Y1 * 120 /
765)-Step(2, 2), RGB(red, green, blue),BF
Next fi
If z > 200 Then
z = 0
a = Int(Rnd * 3 + 2)
b = Int(Rnd * 4 + 2)
End If
End Sub
Private Sub Form_KeyPress(keyascii As Integer)
If keyascii = 32 Then End
End Sub
Узелок на память — лучший
подарок ближнему
Во время отладки я пришел к
интересным находкам, с которыми мне не терпится
со всеми поделиться. Во-первых, зная цвет, которым
рисует “ковер” каждая точка синусоиды, с тем же
успехом можно рисовать участки синусоид этим
цветом, а не белым, как в Capow! Процесс рисования
стал намного нагляднее и зрелищнее, ожила и
“заиграла” сама синусоида.
Во-вторых, синусоида каждый
раз стирается и, сдвинувшись на шаг,
прорисовывается в новой фазе. Однако теперь,
когда она (синусоида) стала цветной и красивой,
можно попробовать ее не стирать и получить
рельефные рисунки невиданной красоты. Такой
красоты, что даже цветной развернутый “коврик”
нам уже не так интересен, и мы его помечаем как
комментарий. В-третьих, заметив красивый след от
синусоид, мы делаем начальную точку прорисовки
синусоиды, движущейся по прямой линии, и получаем
объемные рельефные пейзажи с фантастической
раскраской. И, наконец, заставив двигаться
начальную точку прорисовки синусоиды в полярных
координатах да еще с разными фазами по X и по Y,
получим или невозможный в реальной жизни тор из
двух сцепленных колец (я и сам удивляюсь…) с
противными отростками, или фантастически
завязанный узлом организм. Меняя радиус движения
и ширину синусоиды, можно получить невероятную
спираль, точнее, ракушку, в которой, вероятно, и
проживает пресловутый организм, правда, для
этого ему надо будет “развязаться” и
закрутиться…
Dim tet, z, l, r, x0, y0, a, b As Integer
Private Sub Form_Load()
Randomize (Timer)
a = 9
b = 3
r = 200
End Sub
Private Sub Часы1_Timer()
tet = tet + 0.01
r = r - 0.1
z = r * 1.1 * Sin(1 * tet) + 0
x0 = r * Cos(1 * tet) + 0
l = 3.14159 * 1.2 * Cos(tet / 9) ^ 2
For fi = 0 To l Step 0.01
x = fi * 60
Y1 = 383 * (0.5 * Sin(a * fi) ^ 2 * (Sin(z / 4)) ^ 6 + 0.5 * Cos(b * fi) ^ a)
y = Y1 + 383
b1 = 1.51 * Sin(0.007 * fi * y)
red = Abs(255 * Sin(b1))
green = Abs(255 * Sin(b1 + b))
blue = Abs(255 * Sin(b1 - b))
Line (x + 250 + x0, z + 260 + Y1 * 120 / 765)-Step(2, 2), RGB(red, green,
blue), BF
Next fi
End Sub
Private Sub Form_KeyPress(keyascii As Integer)
If keyascii = 32 Then End
End Sub
Чтобы не создалось
впечатления, что у меня прямо сразу все
получается, приведу задачу, оказавшуюся мне не по
зубам. В Capow иногда появляются функции, имеющие
вид сползающих капель. Я пока не смог подобрать
формулу, чтобы получить эти картинки.
Обращаюсь ко всем, кто дочитал
до конца и будет экспериментировать: если
подберете функцию, сообщите, пожалуйста. И
наконец, ответ на загадку, вынесенную в заглавие.
Эта фраза — палиндром, т.е. читается справа
налево так же, как и слева направо. А зеленый
массив — наверняка хитрость любителей
программировать всякие глупости… |