Волшебные точки

Если у вас математический склад ума и вы все видите через призму уравнений и их отображений на плоскость, то у меня есть кое-что, способное заинтересовать и надолго приковать вас к экрану, особенно когда нечего делать. Впрочем, даже если вышеупомянутое вам чуждо, то все равно наблюдение за простейшей хаотической системой, которую я случайно нашел на просторах интернета, способно вас позабавить и скрасить время, убив его на изучение преобразований точек.

Возьмем вот такую итеративную систему уравнений:

X' =  integer(Y - sqrt(abs(b * X - c))) - 100
Y' =  a - X

где X, Y - начальные точки (т.е точки до преобразований),
    X', Y' - точки после преобразований

А чтобы сделать программку интереснее, доверим ей самой выбирать параметры, а также заставим программу менять цвет точки в зависимости от того, какая по счету итерация произошла.

Нетрудно заметить, что вид рисунка, который получится в итоге, определяется тремя параметрами: a, b и с, и совершенно не зависит от начальной точки, в качестве которой мы возьмем точку с координатами (100; 100) — и отталкиваясь от этого, а также случайных значений параметров, получим следующую программку:

link graphics,random

procedure main()
local W,i
W:=WOpen("size=600,600")
x := 100
y := 100
i := 1
randomize()
a := ?200
b := ?200
c := ?200
col := ["red","orange","yellow","green","cyan","blue","violet","pink","magenta","purple","lightgreen"]
while i <= 1000 do {
   Fg(col[integer(i/100)+1])
   DrawString(300 + x, 200 + y, "*")
   x1 := x
   x := xn(a,b,c,x1,y)
   y := yn(a,x1)
   i +:= 1
}
Fg("magenta")
DrawString(10,20,"a = " || a)
DrawString(10,40,"b = " || b)
DrawString(10,60,"c = " || c)
WDone()
end

procedure xn(a,b,c,x,y)
return integer(y - sqrt(abs(b*x-c))) - 100
end

procedure yn(a,x)
return a - x
end

Как видно, все в этой программке просто: единственный неочевидный момент — это отрисовка точек с помощью DrawString, что довольно легко объяснить — отрисовка с помощью символа «*» гораздо более наглядна и красива (в чем предлагаю вам убедиться самим, заменив DrawString на DrawPoint).

Ну а теперь небольшая галерея полученных мной точек:

Добавить комментарий