import tkinter as tk
import numpy as np
class KochSnowflakeApp:
def __init__(self, root):
self.root = root
self.root.title("Снежинка Koxa")
self.root.geometry("800x700")
self.canvas = tk.Canvas(root, width=780, height=680, bg='white')
self.canvas.pack()
self.button = tk.Button(root, text="Рисовать", command=self.draw_snowflake)
self.button.pack()
def koch_curve(self, p1, p2, depth):
if depth == 0:
return [p1, p2]
x1, y1 = p1
x2, y2 = p2
dx = (x2 - x1) / 3
dy = (y2 - y1) / 3
p_a = (x1 + dx, y1 + dy)
p_b = (x1 + 2 * dx, y1 + 2 * dy)
angle = np.pi / 3
px = p_a[0] + dx * np.cos(angle) - dy * np.sin(angle)
py = p_a[1] + dx * np.sin(angle) + dy * np.cos(angle)
p_c = (px, py)
points = []
points.extend(self.koch_curve(p1, p_a, depth - 1)[:-1])
points.extend(self.koch_curve(p_a, p_c, depth - 1)[:-1])
points.extend(self.koch_curve(p_c, p_b, depth - 1)[:-1])
points.extend(self.koch_curve(p_b, p2, depth - 1))
return points
def koch_snowflake(self, side_length=400, depth=4):
h = side_length * np.sqrt(3) / 2
cx, cy = 390, 400
p1 = (cx - side_length / 2, cy + h / 3)
p2 = (cx + side_length / 2, cy + h / 3)
p3 = (cx, cy - 2 * h / 3)
points = []
points.extend(self.koch_curve(p1, p2, depth)[:-1])
points.extend(self.koch_curve(p2, p3, depth)[:-1])
points.extend(self.koch_curve(p3, p1, depth))
return points
def draw_snowflake(self):
self.canvas.delete("all")
points = self.koch_snowflake(side_length=400, depth=4)
for i in range(len(points) - 1):
x1, y1 = points[i]
x2, y2 = points[i + 1]
self.canvas.create_line(x1, y1, x2, y2, fill='blue', width=1.5)
x1, y1 = points[-1]
x2, y2 = points[0]
self.canvas.create_line(x1, y1, x2, y2, fill='blue', width=1.5)
if __name__ == "__main__":
root = tk.Tk()
арр = KochSnowflakeApp(root)
root.mainloop()