koch_fractal.py 994 B

123456789101112131415161718192021222324252627282930
  1. """Koch snowflake fractal"""
  2. from vedo import sqrt, Line, show
  3. levels = 7
  4. def koch(level):
  5. # Compute Koch fractal contour points
  6. k = sqrt(3)/2
  7. if level:
  8. points = koch(level-1) + [(0, 0)] # recursion!
  9. kpts = []
  10. for i in range(len(points)-1):
  11. p1, p2 = points[i], points[i+1]
  12. dx, dy = (p2[0]-p1[0])/3, (p2[1]-p1[1])/3
  13. pa = (p1[0] + dx , p1[1] + dy )
  14. pb = (p1[0] + dx*2, p1[1] + dy*2)
  15. z = complex(pb[0]-pa[0], pb[1]-pa[1]) * (0.5-k*1j)
  16. p3 = (pa[0]+z.real, pa[1]+z.imag)
  17. kpts += [p1, pa, p3, pb]
  18. return kpts
  19. return [(0, 0), (1, 0), (0.5, k)]
  20. kochs = []
  21. for i in range(levels):
  22. # Create a Line from the points and mesh the inside with minimum resolution
  23. kmsh = Line(koch(i)).generate_mesh(mesh_resolution=1).z(-i/1000)
  24. kmsh.lw(0).color(-i)
  25. kochs.append(kmsh)
  26. show(kochs, __doc__+ f"\nlevels: {levels}\npoints: {kmsh.npoints}", bg2='lb').close()