├── README.md ├── fractal.gif └── fractal.py /README.md: -------------------------------------------------------------------------------- 1 | A simple fractal pattern in python 2 | 3 | Prerequisites: 4 | Python3 5 | pygame (pip install pygame) 6 | numpy (pip install numpy) 7 | 8 | ![Demo](https://github.com/Perseus-Perry/Fractal/blob/master/fractal.gif) 9 | -------------------------------------------------------------------------------- /fractal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purry03/Fractal/2c663ee3dd57b98ba7e6d9cc8b23c065f9a999bb/fractal.gif -------------------------------------------------------------------------------- /fractal.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | import numpy as np 3 | 4 | objects = [] 5 | trails = [] 6 | 7 | class Dot(): 8 | def __init__(self,position=[0,0],velocity=[0,0],color=(255,255,255),radius=5,splitDistance=100): 9 | self.position = position 10 | self.velocity = velocity 11 | self.color = color 12 | self.radius = radius 13 | self.splitDistance = splitDistance 14 | self.intialPosition = [position[0],position[1]] 15 | self.split = False 16 | def updatePos(self): 17 | self.position[0] += self.velocity[0] 18 | self.position[1] += self.velocity[1] 19 | 20 | def draw(self,surface): 21 | position = [int(self.position[0]),int(self.position[1])] 22 | pygame.draw.circle(surface,self.color,position,self.radius) 23 | 24 | def create(position=[0,0],velocity=[0,0],color=(255,255,255),radius=5,splitDistance=100): 25 | object = Dot(position,velocity,color,radius,splitDistance=splitDistance) 26 | objects.append(object) 27 | del object 28 | 29 | def delete(object): 30 | objects.remove(object) 31 | 32 | def update(): 33 | for object in objects: 34 | object.updatePos() 35 | 36 | def draw(surface): 37 | for object in objects: 38 | object.draw(surface) 39 | 40 | def makeTrail(objects,color): 41 | try: 42 | for object in objects: 43 | trail = Dot(position=list(object.position),velocity=[0,0],radius=1,color=color) 44 | trails.append(trail) 45 | except: 46 | pass 47 | 48 | def drawTrail(surface): 49 | for trail in trails: 50 | trail.draw(surface) 51 | 52 | def dotDistance(dot1,dot2): 53 | dist = np.sqrt(np.power((dot1[0]-dot2[0]),2)+np.power((dot1[1]-dot2[1]),2)) 54 | return dist 55 | 56 | def distance(point1,point2): 57 | dist = np.sqrt(np.power((point1-point2),2)+np.power((point1-point2),2)) 58 | return dist 59 | 60 | maxSplits = np.power(2,7) 61 | size= (700,700) 62 | vel_table = [[0,-1],[-1,-1],[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1]] 63 | pygame.init() 64 | clock = pygame.time.Clock() 65 | screen = pygame.display.set_mode(size) 66 | pygame.display.set_caption("Fractal") 67 | run_game = True 68 | black=(0,0,0) 69 | white = (255,255,255) 70 | create([350,700],[0,-1],white) 71 | print(len(vel_table)) 72 | color = [100,100,100] 73 | startGame = True 74 | 75 | 76 | 77 | 78 | while run_game: 79 | # handle quit event 80 | for event in pygame.event.get(): 81 | if event.type == pygame.QUIT: 82 | run_game = False 83 | if event.type == pygame.KEYDOWN: 84 | if event.key == pygame.K_p: 85 | startGame = True 86 | 87 | screen.fill(black) 88 | 89 | if startGame: 90 | 91 | update() 92 | makeTrail(objects,color) 93 | drawTrail(screen) 94 | draw(screen) 95 | 96 | if maxSplits > 0: 97 | for object in objects: 98 | if object.split: 99 | continue 100 | if dotDistance(object.intialPosition,object.position) > object.splitDistance: 101 | index = vel_table.index(object.velocity) 102 | left_vel = index+1 103 | right_vel = index-1 104 | if left_vel >= len(vel_table): 105 | left_vel = 0 106 | if right_vel < 0 : 107 | right_vel = len(vel_table)-1 108 | create([object.position[0],object.position[1]],vel_table[left_vel],splitDistance=(object.splitDistance/1.75)) 109 | create([object.position[0],object.position[1]],vel_table[right_vel],splitDistance=(object.splitDistance/1.75)) 110 | object.velocity = [0,0] 111 | object.split = True 112 | delete(object) 113 | maxSplits -= 1 114 | 115 | if not maxSplits > 0 : 116 | for object in objects: 117 | if object.velocity != [0,0]: 118 | delete(object) 119 | 120 | 121 | pygame.display.update() 122 | 123 | clock.tick(60) 124 | --------------------------------------------------------------------------------