Пилюли для Пигмалиона и воздушная кукуруза

Перепечатно с отрывками

Одна из самых притягательных задач для любителей математики – получить красивые картинки основываясь на цифрах числа Пи. Начнем с технологии – как нарисовать объемный шар? Если задать круг с заливкой цветом, то это и останется плоский круг с заливкой – ничего интересного. Поэтому воспользуемся приемом – задаем толщину линий побольше, 4 или 5 пикселей (Picture1.DrawWidth=4) и рисуем окружность выбранным цветом без заливки. Теперь смещаем центр на несколько пикселей вверх и влево, увеличиваем яркость цвета и рисуем еще окружность, эту процедуру повторяем, пока радиус не выродится в нуль. Подобрав смещение центра и увеличение яркости, мы получим красивейший объемный шар, буквально выпирающий из монитора. Играя коэффициентами изменения цвета и прочими параметрами можно получать как блестящие яркие новогодние игрушки, так и матово-костяные бильярдные шары. Причем, каждый шар красив по-своему, хочется сохранить каждый вариант, поэтому единственный способ насладиться этой забавой – насыпать много шаров с разными случайными параметрами.




Текст программы (фрагмент):

Видно, что реализовано не совсем так, как описано выше, круги рисуются в цикле от единичного радиуса до радиуса шара, а цвет меняется от белого до цвета шара.
Налюбовавшись на шары, думаем, что из них можно соорудить. Конечно же, модели молекул, розетку с зернистой икрой, виноградную кисть и … кукурузный початок. На фоне шаров, естественно.



Фрагмент кода для початка.



Теперь мы во всеоружии, готовы к тому, чтобы заняться визуализацией числа Пи.
В приводимом листинге программы в начале проведены некоторые подготовительные действия. Чтобы быстрее заняться непосредственно рисунком, я перенес первые 720 цифр числа Пи прямо в текст программы, как они были в файле html с пробелами через каждые 10 цифр. Точку после тройки удалил сам, а для удаления пробелов пришлось сделать «перекидку» из массива «а» в массив «с» с удалением пробелов. Для более серьезного занятиями с цифрами Пи такой метод не очень годиться, если вы захотите использовать десятки или сотни тысяч известных знаков, то, конечно, лучше открыть файл со знаками и считывать из него. Здесь используется функция выделения символов из строки mid(m,n,k), где m – имя исходной строки символов, n – номер символа, с которого надо начинать выделение и k – количество выделяемых символов. Например, q=”победа” w=mid(q,3,4) присвоит q “беда”. (Кстати, на страничке «Visual Basic на русском», автор которой дал много ценных советов и замечаний по программному содержанию Арбуза, расположен хороший файл – «help» по функциям этого языка, рекомендую.)
Дальнейшее должно быть понятно: в цикле рассматриваем по 12 символов, из которых первые три определяют координату центра по горизонтали, вторые три – по вертикали, следующие две цифры определяют радиус шара, из следующих оставшихся четырех формируется цвет шара. А как сделать шар объемным мы уже рассмотрели.

Dim pi As Double, i As Integer, a As Stringa = "31415926535 8979323846 2643383279 5028841971" + _"6939937510 5820974944 5923078164 0628620899" + _"8628034825 3421170679 8214808651 3282306647" + _"0938446095 5058223172 5359408128 4811174502" + _"8410270193 8521105559 6446229489 5493038196" + _"4428810975 6659334461 2847564823 3786783165" + _"2712019091 4564856692 3460348610 4543266482" + _"1339360726 0249141273 7245870066 0631558817" + _"4881520920 9628292540 9171536436 7892590360" + _"0113305305 4882046652 1384146951 9415116094" + _"3305727036 5759591953 0921861173 8193261179" + _"3105118548 0744623799 6274956735 1885752724" + _"8912279381 8301194912 9833673362 4406566430" + _"8602139494 6395224737 1907021798 6094370277" + _"0539217176 2931767523 8467481846 7669405132" + _"0005681271 4526356082 7785771342 7577896091" + _"7363717872 1468440901 2249534301 4654958537" + _"1050792279 6892589235 4201995611 2129021960"c = ""For i = 1 To 720b = Mid(a, i, 1)If b <> " " Then c = c + bNext iPicture2.DrawWidth = 3For z = 1 To 708 step 12x = Val(Mid(c, z, 3)) / 2y = Val(Mid(c, z + 3, 3)) / 2r = Val(Mid(c, z + 6, 2)) / 3 + 40co = Mid(c, z + 8, 4)re = Int(Val(co) / 20)gr = Val(Mid(co, 1, 2)) * 3bl = Val(Mid(co, 3, 2)) * 4For j = 1 To r Step 1red = re - j * 2green = gr - j * 2blue = bl - j * 4If red < 0 Then red = 0If green < 0 Then green = 0If blue < 0 Then blue = 0col = RGB(red, green, blue)Picture2.Circle (x + j / 3, y + j / 2), j, colNext jNext z


Рассмотрите полученный рисунок. Несмотря на искусственность проделанных операций, он волнует воображение – мы видим одно из представлений таинственного числа. Покажите знакомым – они будут удивлены открывающейся красотой и многие, к своему удивлению, заинтересуются числом Пи.

А мы вернемся к нашим картинкам. Как еще, кроме шаров, можно красиво представить непредсказуемые цифры Пи? Думаем, думаем и – а что, если рисовать не шары, а прямоугольники? Попробовав разные варианты (откинув залитые цветом и неправильные как не отвечающие нашим представлениям о красоте) останавливаемся на разноцветных квадратах. Алгоритм такой же, как и с шарами, только вместо радиуса поучаем сторону квадрата. Не хотелось бы навязывать оценку, но уверен, что каждый найдет полученный коврик красивым и даже веселым.

И фрагмент кода для квадратов:

Picture2.DrawWidth = 9For z = 1 To 100 step 12x = Val(Mid(c, z, 3)) / 2y = Val(Mid(c, z + 3, 3)) / 2r = Val(Mid(c, z + 6, 2)) + 0co = Mid(c, z + 8, 4)re = Int(Val(co) / 10)gr = Val(Mid(co, 1, 2)) * 4bl = Val(Mid(co, 3, 2)) * 5For j = 1 To r Step 1red = re - j * 2green = gr - j * 2blue = bl - j * 4If red < 0 Then red = 0If green < 0 Then green = 0If blue < 0 Then blue = 0col = RGB(red, green, blue)Picture2.Line (x, y)-Step(r, r), col, BNext jNext z

И вдруг новая идея – выводить отрезки прямых разной длины и под разным углом! Чтобы получить длину и угол из тех же порций по 12 цифр выделяем для координат по х и по y не по три цифры как для шаров, а по две. Четыре, как и с шарами-квадратами отдаем для цвета, а из оставшихся четырех два используем для получения длины отрезка, а два – для угла его наклона к горизонтальной оси, что, впрочем, не так важно. И сразу же получаем потрясающий рисунок, при некоторой фантазии в нем можно даже разглядеть лохматое лицо, это и есть один их портретов таинственного Пи.


И фрагмент кода.
Picture2.DrawWidth = 9
For z = 1 To 190
x = Val(Mid(c, z, 2)) * 3 + 100
y = Val(Mid(c, z + 2, 2)) * 3 + 50
r = Val(Mid(c, z + 4, 2)) * 2
u = 3.14159 * Val(Mid(c, z + 6, 2)) / 90
co = Mid(c, z + 8, 4)
re = Int(Val(co) / 10)
gr = Val(Mid(co, 1, 2)) * 6
bl = Val(Mid(co, 3, 2)) * 5
For j = 1 To r Step 1
red = re - j * 2
green = gr - j * 2
blue = bl - j * 4
If red < 0 Then red = 0
If green < 0 Then green = 0
If blue < 0 Then blue = 0
col = RGB(red, green, blue)
Picture2.Line (x, y)-Step(r * Cos(u), r * Sin(u)), col
Next j
Next z

Переменная u – и есть угол наклона отрезков. Забавно, что, имея 720 знаков Пи, мы все равно для перевода u в радианы взяли по привычке 5 знаков, да и двух вполне хватило бы.


Реклама