Клиффорд Пикоувер (Cliff Pickover), основатель, если можно так выразиться, компьютерного построения организмов и методов визуализации информации. Еще в конце 1980-х годов журнал «Scientific American» («В мире науки» 9/1989) рассказывал об этом ученом и о биоморфах - фрактальных картинках, похожих на живые организмы. В нём был выложен апплет, рисующий паутину при щелчке мышки по нему, причем рисунок каждый раз разный. Тут же приводится рассказ о паучке, плетущем эту паутину, а также алгоритм ее построения.
На окружности берутся точки с определенным шагом, и каждая из них соединяется с такой же точкой, но сдвинутой по фазе в какое-то число раз (n). Это число можно задавать или брать случайным образом, как в апплете Пикоувера. Точки пересечения хорд сливаются в муаровый узор самых замысловатых форм. Идея так притягательна, что невозможно не попробовать реализовать ее самостоятельно, чтобы поиграть с параметрами и насладиться эффектами. При n=1 не нарисуется ничего, так как начальные и конечные точки линий совпадают, зато при увеличении n будут появляться фигуры с узлами, причем количество узлов равно n-1. Для n=2 нарисуется фигура, хорошо известная любителям математики, - кардиоида (частный случай улитки Паскаля), при nі3 - так называемая нефроида с двумя узлами. Если n-1 - делитель числа 360, то картинка проявляет некоторую упорядоченность. Приводим скриншоты для значений n=92, 96 и 97. Попробуйте сами нарисовать картинку для n=89 и попытайтесь объяснить необычный результат.
А теперь - изюминка (уверен, что многие читатели уже догадались какая): меняем n в цикле (желательно с нуля и с малым шагом), перерисовываем заново, и нашему взору предстает изумительная картина. Справа все время рождаются узлы и, постепенно замедляясь и теснясь, движутся против часовой стрелки. Внезапно появляются купола, движущиеся от периферии к центру и, прежде чем исчезнуть, на мгновение превращающиеся в концентрические кольца. Кроме того, постоянно движутся концентрические зоны, меняя скорость и направление, порождают фантастические узоры из узлов. Особенно «повезло» близоруким: сняв очки, они увидят пульсирующий Солярис, постоянно собирающийся в меняющиеся узоры.
Public Class Form1
Dim Gr As Graphics, P1 As Pen, A As Double, Xx, Yy, R As Single
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
If Tmr1.Enabled = True Then Tmr1.Enabled = False Else Tmr1.Enabled = True
End Sub
Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
End
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Me.WindowState = 2
A = 0
Xx = Me.Width / 2
Yy = Me.Height / 2
R = Yy
Gr = Me.CreateGraphics
P1 = New Pen(Color.Yellow, 1)
End Sub
Private Sub Tmr1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Tmr1.Tick
Dim I As Integer, X, Y, X2, Y2, T As Single
A = A + 1
Gr.Clear(Me.BackColor)
For I = 0 To 360 Step 1
T = I * Math.PI / 180
X = R * Math.Cos(T)
Y = R * Math.Sin(T)
X2 = R * Math.Cos(A * T)
Y2 = R * Math.Sin(A * T)
Gr.DrawLine(P1, X + Xx, Y + Yy, X2 + Xx, Y2 + Yy)
Next I
Application.DoEvents()
End Sub
End Class
Public Class Form1
Dim Gr As Graphics, P1 As Pen, A As Double, Xx, Yy, R As Single, Ax, Ay, Col, Col1 As Integer
Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
End 'завершение программы при двойном щечке на форме
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.WindowState = 2
A = 0 'угол поворота паутинки
Col = 10 'переменная для определения цвета линий
Col1 = 1 'переменная для определения цвета линий
Ax = 10 'шаг перемещения паутинки по оси Х
Ay = 10 'шаг перемещения паутинки по оси Y
Xx = Me.Width / 2 'начальные координаты центра паутинки
Yy = Me.Height / 2
R = Xx / 5 'радиус паутинки
End Sub
Private Sub Tmr1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Tmr1.Tick
Dim I, K As Integer, X, Y, X2, Y2, T As Single
Gr = Me.CreateGraphics
P1 = New Pen(Color.HotPink, 1)
A = A + 0.1
Xx = Xx + Ax
Yy = Yy + Ay
Col1 = Col1 + 1
Gr.Clear(Me.BackColor)
For I = 0 To 360 Step 2 'Построение паутинки
T = I * Math.PI / 180
X = R * Math.Cos(T)
Y = R * Math.Sin(T)
X2 = R * Math.Cos(A * T)
Y2 = R * Math.Sin(A * T)
Gr.DrawLine(P1, X + Xx, Y + Yy, X2 + Xx, Y2 + Yy)
P1.Color = Color.FromArgb(255 - Col1, Col, Col1)
For K = 1 To 10000 : Next K
Col = Col + 1
If Col Mod 255 = 0 Then Col = 10
Next I
If Xx + R > Me.Width Or Xx - R < 0 Then Ax = -Ax 'анализ касания края экрана
If Yy + R > Me.Height Or Yy - R < 0 Then Ay = -Ay
If Col1 Mod 255 = 0 Then Col1 = 1
End Sub
End Class