Kodomo

Пользователь

Условия и циклы. Первый фрактал своими руками.

Конспекты прошлых лет

План

Пример: множество Мандельброта

   1 from Tkinter import Tk, Button, Canvas, PhotoImage
   2 
   3 def in_mandel(x, y):
   4     z = 0
   5     c = x + 1j * y
   6     for i in range(10):
   7         z = z ** 2 + c
   8         if abs(z) > 10:
   9             return False
  10     return True
  11 
  12 def draw_mandel():
  13     for x in range(200):
  14         for y in range(200):
  15             if in_mandel((x-100)/50.0, (y-100)/50.0):
  16                 image.put("white", to=[x, y])
  17 
  18 root = Tk()
  19 canvas = Canvas(root, width=199, height=199, background="black")
  20 image = PhotoImage(width=200, height=200)
  21 canvas.create_image(0, 0, image=image, anchor="nw")
  22 canvas.pack()
  23 button = Button(root, text="Draw", command=draw_mandel)
  24 button.pack()
  25 root.mainloop()

Пример: треугольник Серпинского методом IFS

   1 import random
   2 from Tkinter import Tk, Button, Canvas, PhotoImage
   3 
   4 def putpixel(x, y):
   5     x = int(x * 100 + 100)
   6     y = int(y * 100 + 100)
   7     image.put("white", to=[x, y])
   8 
   9 def draw_serp():
  10     x = random.random()
  11     y = random.random()
  12     for step in range(1500):
  13         choice = random.choice(["top", "left", "right"])
  14         if choice == "top":
  15             x1 = x * 0.5
  16             y1 = y * 0.5 + 0.5
  17         elif choice == "left":
  18             x1 = x * 0.5 - 0.5
  19             y1 = y * 0.5
  20         elif choice == "right":
  21             x1 = x * 0.5 + 0.5
  22             y1 = y * 0.5
  23         x = x1
  24         y = y1
  25         if step > 50:
  26             putpixel(x, y)
  27 
  28 root = Tk()
  29 canvas = Canvas(root, width=199, height=199, background="black")
  30 image = PhotoImage(width=200, height=200)
  31 canvas.create_image(0, 0, image=image, anchor="nw")
  32 canvas.pack()
  33 button = Button(root, text="Draw", command=draw_serp)
  34 button.pack()
  35 root.mainloop()

Задание

Памятка: задание – то, что обязательно выполнить для получения зачёта; упражнения – необязательные, но как правило задание решить проще, если сначала выполнить все упражнения; если вы меня пнёте, выдам вам комментарии про то, что и как лучше, и по заданию, и по упражнениям.

  1. Выберите себе фрактал из списка (либо предложите свой вариант). Сообщите мне о своём выборе. Обратите внимание, что у разных фракталов разная сложность реализации.
  2. По образу и подобию примеров выше сделайте в вашем репозитории файл fractal.py, которая рисует изображение вашего фрактала с выбранными на ваш вкус параметрами

Упражнения

  1. Скоприруйте к себе в репозиторий пример выше с множеством Мандельброта в файл mandel.py

  2. Аналогично пункту 1 про треугольник Серпинского в файл sierpinsky.py

Фракталы

  1. http://en.wikipedia.org/wiki/Barnsley_fern

  2. http://en.wikipedia.org/wiki/Brownian_motion

  3. http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%BE%D1%83%D0%BD%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE

  4. ( http://en.wikipedia.org/wiki/Eisenstein_series )

  5. http://en.wikipedia.org/wiki/Graftal / http://en.wikipedia.org/wiki/L-system

  6. http://en.wikipedia.org/wiki/Hexaflake

  7. ( http://en.wikipedia.org/wiki/Lyapunov_fractal )

  8. ( http://en.wikipedia.org/wiki/Lute_of_Pythagoras )

  9. http://en.wikipedia.org/wiki/Mandelbrot_set

  10. http://en.wikipedia.org/wiki/Multibrot_set

  11. http://en.wikipedia.org/wiki/N-flake#Vicsek_fractal

  12. http://en.wikipedia.org/wiki/Rauzy_fractal

  13. http://en.wikipedia.org/wiki/Sierpi%C5%84ski_arrowhead_curve

  14. http://en.wikipedia.org/wiki/Sierpinski_carpet

  15. http://en.wikipedia.org/wiki/Sierpinski_triangle

  16. http://en.wikipedia.org/wiki/T-square_(fractal)

  17. http://en.wikipedia.org/wiki/Vicsek_fractal