Примеры фракталов, сгенерированных СИФ

Смотреть материал на YouTube | RuTube

Архив проекта: 12_fractals.py

На этом занятии мы рассмотрим несколько вариантов систем итерированных функций для построения различных фракталов. Для этого я воспользуюсь рандомизированным вариантом СИФ и буду итерационно, точка за точкой строить фрактальные изображения.

Но вначале внесем небольшие изменения в программу прошлого занятия. Создадим поверхность, на которой будем рисовать фрактал:

surf_draw = pygame.Surface((W, H))
surf_draw.fill(WHITE)

Затем, определим коэффициенты, цвет точек, создадим экземпляр класса SIF и зададим координату начальной точки и размер изображения фрактала:

C = [(0.7, 0, 0, 0.7, 0.1496, 0.2962),
     (0.1, -0.433, 0.1732, 0.25, 0.4478, 0.0014),
     (0.1, 0.433, -0.1732, 0.25, 0.4445, 0.1559),
     (0.0, 0.0, 0.0, 0.3, 0.4987, 0.007),
]
 
color = (40, 97, 21)
 
sif = SIF(C)
pt = (0, 0)
scale = (400, 400)
pos = (0, 0)

Далее, в главном цикле реализуем формирование и отрисовку точек на каждой итерации:

n_iter = 1
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
 
    if n_iter < 100000:
        pygame.draw.circle(surf_draw, color, (round(pt[0]), round(pt[1])), 0)
        pt = sif.get_next_point( pos, pt, scale )
        n_iter += 1
 
        sc.blit( pygame.transform.flip(surf_draw, False, True), (200, -100) )
 
    pygame.display.update()
    clock.tick(FPS)

Мы здесь все рисуем на поверхности surf_draw и чтобы изображение фрактала воспринималось привычным образом, зеркально отображаем эту поверхность по вертикали и рисуем с координатами (200; -100).

Добавим еще отрисовку номера итерации. Определим шрифт и начальный текст:

f_sys = pygame.font.SysFont('arial', 36)
sc_text = f_sys.render(f'Итерация: 0', 1, BLACK)

А в главном цикле реализуем отображение текста:

        if n_iter % 100 == 0:
            sc_text = f_sys.render(f'Итерация: {n_iter}', 1, BLACK)
 
        sc.blit( pygame.transform.flip(surf_draw, False, True), (200, -100) )
        pygame.draw.rect(sc, WHITE, sc_text.get_rect(topleft=(50, 20)))
        sc.blit( sc_text, (50, 20))

То есть, мы будем показывать итерации, кратные 100, чтобы не перегружать процессор компьютера.

Все, программа готова. Теперь достаточно менять список коэффициентов C для получения различных фрактальных форм. Поехали! (См. видео).