niedziela, 5 stycznia 2020

Dywan i kartka Sierpińskiego (gry w chaos)



Napisałem program w Small Basicu, który generuje dywan Sierpińskiego. Procedura jest prosta. Ustala się położenie ośmiu punktów, cztery w narożach kwadratu i jeszcze cztery w połowie długości boków kwadratu. Potem wybiera się dowolny punkt i losuje jesten z ustalonych punktów. W następnym kroku ustala się punkt leżący w połowie odległości pomiędzy punktem wybranym a wylosowanym. Procedurę się powtarza. W wyniku powtórzenia jae bardzo dużą liczbę razy, otrzymuje się rysunek jak poniżej (Program 1):

Dywan Sierpińskiego otrzymany z gry w chaos

Jeśli losuje się dowolne punkty na osi x i y, to otrzymuje się coś, co nazwałem kartką Sierpińskiego. Stopień wypełnienia kartki zależy od liczby iteracji:


Teksty programów, które realizują opisane algorytmy:


'Program 1. Dywan  Sierpińskiego utworzony z za pomocą gry w chaos
trans_x=500  'umiejscowienie punktu (0,0) na ekranie
trans_y=400
scale= 100    'skala rysowania 100 dla a=0.69
xw[1] = 1     'wierzchołki i punkty na bokach kwadratu
yw[1] = 1
xw[2] = 1
yw[2] =-1
xw[3] =-1
yw[3] =-1
xw[4] =-1
yw[4] = 1
xw[5] = 1
yw[5] = 0
xw[6] = 0
yw[6] =-1
xw[7] =-1
yw[7] = 0
xw[8] = 0
yw[8] = 1
x=0.1
y=0.1
a = 0.69 'dla 0.69 mamy okno Sierpińskiego i skali 100
GraphicsWindow.Width=1000
GraphicsWindow.Height=800
For i = 1 To 4000000
  rog = math.GetRandomNumber(8) 'losowanie numeru punktu kwadratu

   x = x - (x - xw[rog]) / a
   y = y - (y - yw[rog]) / a

  x_screen=x*scale +trans_x
  y_screen=y*scale +trans_y
  GraphicsWindow.SetPixel(x_screen, y_screen, "blue")
  GraphicsWindow.DrawEllipse(trans_x,trans_y, 1, 1)
Endfor
GraphicsWindow.DrawBoundText(10,400,200, "Koniec obliczeń")

'Program 2.Kartka  Sierpińskiego
'Utworzona z wykorzystaniem losowania punktów na osiach
trans_x=400  'umiejscowienie na ekranie
trans_y=300
scale=200    'skala rysowania 100 dla a=0.69
x=0.1
y=0.1
a = 1
GraphicsWindow.Width=1000
GraphicsWindow.Height=800
For i = 1 To 100000
  xlos = (math.GetRandomNumber(10001)-1)/10000 'losowanie punktu na osi x
  ylos = (math.GetRandomNumber(10001)-1)/10000 'losowanie punktu na osi y
   x = x - (x - xlos) / a
   y = y - (y - ylos) / a

  x_screen=x*scale +trans_x
  y_screen=y*scale +trans_y
  GraphicsWindow.SetPixel(x_screen, y_screen, "blue")
  GraphicsWindow.DrawEllipse(trans_x,trans_y, 1, 1)
Endfor
GraphicsWindow.DrawBoundText(10,400,200, "Koniec obliczeń")





Brak komentarzy:

Prześlij komentarz