def scatter_inside(x, y, beta=0.15):
ratiox = - beta * log(random.random())
ratioy = - beta * log(random.random())
dx = ratiox * (x - CANVAS_CENTER_X)
dy = ratioy * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
# 定义扰动函数
def shrink(x, y, ratio):
force = 1 / ((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.5
dx = ratio * force * (x - CANVAS_CENTER_X)
dy = ratio * force * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
# 创建心形点
def build(self, number):
for _ in range(number):
t = random.uniform(0, 2 * pi)
x, y = heart_function(t)
self._points.add((int(x), int(y)))
for xx, yy in list(self._points):
for _ in range(3):
x, y = scatter_inside(xx, yy, 0.05)
self._extra_points.add((x, y))
# inside点
point_list = list(self._points)
for _ in range(4000):
x, y = random.choice(point_list)
x, y = scatter_inside(x, y)
self._inside.add((int(x), int(y)))
# 计算心形点
def calc_position(self, x, y, ratio):
force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.5)
dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)
dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)
return x - dx, y - dy
# outline 心形点
for x, y in self._points:
x, y = calc_position(x, y, ratio)
size = random.randint(1, 3)
all_points.append((x, y, size))
# inner内圈点
for x, y in self._extra_points:
x, y = calc_position(x, y, ratio)
size = random.randint(1, 2)
all_points.append((x, y, size))
for x, y in self._inside:
x, y = calc_position(x, y, ratio)
size = random.randint(1, 2)
all_points.append((x, y, size))
self.all_points[frame] = all_points
# 画出心形点
def render(self, canvas, frame):
for x, y, size in self.all_points[frame % 20]:
canvas.create_rectangle(
x, y, x + size, y + size, width=0, fill="#ff7171")