Advertisement
Guest User

Untitled

a guest
Jun 30th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. import sys
  2. import random
  3. import math
  4.  
  5. import numpy as np
  6. from PIL import Image
  7.  
  8. from python.common import line
  9.  
  10.  
  11. def chaos_game(size, n=3, r=1 / 2, randomize_points=False, coloring=False, random_weight=False, name="chaosgame.png"):
  12. im = Image.new("RGB", (size + 10, size + 10), (255, 255, 255))
  13.  
  14. angle = lambda: math.radians((360 / n))
  15.  
  16. if randomize_points:
  17. angle = lambda: math.radians((360 / n) + random.randrange(0, 360))
  18.  
  19. length = size / 2
  20. canvas_half = size / 2
  21. corner_points = [(math.cos(i * angle()), math.sin(i * angle()))
  22. for i in range(n)]
  23. rot_angle = math.radians(-90)
  24. normalized_points = [(round((p[0] * math.cos(rot_angle) - p[1] * math.sin(rot_angle)) * length + canvas_half),
  25. round((p[0] * math.sin(rot_angle) + p[1] * math.cos(rot_angle)) * length + canvas_half))
  26. for p in corner_points]
  27.  
  28. print(corner_points)
  29. print(normalized_points)
  30.  
  31. dmin, dmax = sys.maxsize, -sys.maxsize
  32.  
  33. start_point = round(size / 2), round(size / 2)
  34.  
  35. paint_points = []
  36.  
  37. random_nums = [random.randint(1, n + 1) for _ in range(n)]
  38. probabilities = [x / sum(random_nums) for x in random_nums]
  39.  
  40. print(probabilities)
  41.  
  42. for i in range(1000000):
  43. edge_point = random.choice(normalized_points)
  44. if random_weight:
  45. index = np.random.choice(n, 1, p=probabilities)[0]
  46. edge_point = normalized_points[index]
  47.  
  48. paint_point = round(edge_point[0] * (1 - r) + start_point[0] * r), \
  49. round(edge_point[1] * (1 - r) + start_point[1] * r)
  50. start_point = paint_point
  51. if i > 100:
  52. distances = []
  53. if coloring:
  54. for point in normalized_points:
  55. distance = line.fromPoints(start_point, point).len()
  56. distances.append(distance)
  57. dmin = min(dmin, distance)
  58. dmax = max(dmax, distance)
  59.  
  60. paint_points.append((paint_point, distances))
  61.  
  62. for p, distances in paint_points:
  63. color = [0, 0, 0]
  64.  
  65. if coloring:
  66. span = dmax - dmin
  67. ratio = 256 / span
  68.  
  69. color.clear()
  70. sorted(distances)
  71.  
  72. for d in distances[:3]:
  73. c = int((d - dmin) * ratio)
  74. color.append(c)
  75.  
  76. im.putpixel(p, tuple(color))
  77.  
  78. im.save(name)
  79.  
  80. # chaos_game(1500, 5, 1 / 3, False, False, True, "1500_pent_random_weights.png")
  81. # chaos_game(1500, 5, 1 / 3, True, False, False, "1500_pent_random_points.png")
  82. # chaos_game(1500, 5, 1 / 3, False, True, False, "1500_pent_colors.png")
  83.  
  84. # chaos_game(1500, 3, 1 / 2, False, False, True, "triangle_random_weights.png")
  85. # chaos_game(1500, 3, 1 / 2, True, False, False, "triangle_random_points.png")
  86. # chaos_game(1500, 3, 1 / 2, False, True, False, "triangle_colors.png")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement