Использованы материалы сайта
Если информацию представить в виде последовательности бит — нулей и единичек,
то один из способов “увидеть” ее состоит в “замощении” экрана этакими плитками,
состоящими из двух четвертей круга в квадрате и имеющими две различные
ориентации. Если пришла единичка, выбирается первая плитка, а если нуль, то
вторая. В итоге мы получим красивый узор с шариками, гантельками, длинными
коридорами и лабиринтами. Не поверите, но узор от упорядоченной информации,
созданной человеком, отличается от узора, сгенерированного хаотическим шумом!
Кто знает, может, именно она позволит обнаружить сигналы от внеземных
цивилизаций (интересно, какие у них там понятия о гармонии?). Эта модель
порождает множество занимательных задач. Например, какова доля одиночных шариков
в общем числе плиток, каких звеньев больше — двойных или тройных, всегда ли
можно найти “дорожку” от одного края картинки к другому? Интересная забава —
рассматривать варианты соединений шариков. Например, четырехзвенные цепочки
могут быть выполнены в виде линии или в виде, когда четвертый шарик отходит от
среднего из трех. Для пятизвенных цепочек количество вариантов возрастает, но вы
их можете перебрать, рисуя карандашом на бумаге. Очевидно, что с ростом числа
звеньев число вариантов резко увеличивается. Редкие чудаки, любившие в школе
органическую химию, заметят здесь аналогию с количеством вариантов комбинаций
предельных углеводов.
А еще представьте трехмерную модель таких плиток.
У кубика вырезаем сферические лунки на некоторых вершинах и выкладываем такие
кубики в большой куб, например 5х5х5 кубиков. Будут ли у нас туннели? Или
замкнутые “внутренности”? Посидев минут десять с умным видом, вы убедитесь, что
модель совсем не работает, т.к. вырезанные сферы могут создавать только
отдельные, не связанные друг с другом пустоты. (Надеюсь, я ошибаюсь, и
кто-нибудь меня поправит). Зато работает другой вариант: представьте, что от
середины грани куба проложена труба к середине смежной грани (внутри куба,
естественно). Сколько вариантов кубиков с двумя трубками может существовать?
Если мы снова выложим куб 5х5х5 и в одно из верхних отверстий начнем лить
кока-колу, то заполним ли мы этим божественным напитком все полости или он сразу
выльется в ближайшем выходе? И совсем сложный вопрос для тех, у кого развито
воображение: соединим трубками середины смежных граней ЧЕТЫРЕХМЕРНОГО куба.
Сколько вариантов трубок можно отвести от одной грани? (колу в такой куб лучше
не лить — затопим четвертое измерение, неизвестно, где она вновь появится в
нашем мире)
Дальнейшее развитие идея визуализации информации за счет
замощения плоскости плитками получила в работах австралийского художника Пола
Брауна (Paul Brown), подробнее см.
Если нумеровать квадратики, заполняющие плоскость рядами, то
номера, кратные какому-либо числу, будут выстраиваться по прямым линиям. Вид
этих линий будет зависеть от числа, которому задается кратность, и от количества
квадратиков в ряду. Можно попытаться раскрасить все числа, кратные, например,
семи, в красный цвет, пяти — в синий и т.д. и полюбоваться узором кратности и
делимости чисел. Есть и более таинственные узоры: если располагать числа подряд
по раскручивающейся спирали, то простые числа расположатся вдоль прямых линий
(т.н. скатерть Улама). Мало кто знает, что если выписывать числа по треугольной
спирали, то простые числа тоже ложатся на некоторые таинственные линии. Как
известно, теории простых чисел до сих пор не существует, и их поиск сводится к
“неинтеллектуальному” перебору и проверки делимости. У каждого есть шанс
прославиться, найдя новое простое число, их, даже не очень больших, огромное
множество. Если же вы делаете первые шаги в программировании, то попробуйте
просто написать программу, располагающую квадратики по спирали, — прекрасное
упражнение с получением удовольствия от созерцания результата.
Путешествуя по Сети, я попал на страничку преподавателя математики и
программирования Университета в Сан-Хосе Руди Руккера (Rudy Rucker) —
Можно даже сконструировать детектор лжи, основанный на раскрашивании
колебаний голоса подозреваемого — при волнении картинка наверняка резко
изменится. Главное же предназначение метода — выявить негативные тенденции
исследуемого процесса и, своевременно вмешавшись, не дать ему дойти до кризисной
точки. Красочная картинка в виде меняющегося ковра просто не имеет конкурентов в
решении этой задачи.
Мы, конечно, хотим иметь свою такую программу, чтобы
самим поиграть с ее параметрами. Поясню, что основная идея состоит в том, чтобы
точки на плоскости закрашивать цветами в зависимости от значения рассматриваемой
функции. Функция меняется во времени, создавая таким образом цветной узор на
ползущем “коврике”. Поблагодарив мысленно авторов 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 иногда появляются функции, имеющие вид сползающих капель. Я пока не смог подобрать формулу, чтобы получить эти картинки.
Обращаюсь ко всем, кто дочитал до конца и будет экспериментировать: если подберете функцию, сообщите, пожалуйста