import matplotlib.pyplot as plt
import numpy as np
def koch_curve(x, y, length, angle, n):
if n == 0:
dx = length * np.cos(np.deg2rad(angle))
dy = length * np.sin(np.deg2rad(angle))
return [[x, x + dx], [y, y + dy]]
else:
segments = []
for i in range(4):
new_x, new_y = x, y
if i % 2 == 0:
angle += 60
else:
angle -= 120
new_segments = koch_curve(new_x, new_y, length / 3, angle, n - 1)
x, y = new_segments[0][-1], new_segments[1][-1]
segments.extend(new_segments)
return segments
def draw_koch_curve(level):
plt.figure(figsize=(8, 8))
plt.axis('equal')
plt.axis('off')
start_x, start_y = -1, -0.5
length = 3
angle = 0
segments = koch_curve(start_x, start_y, length, angle, level)
for segment in segments:
plt.plot(segment[0], segment[1], color='blue')
plt.show()
# Укажите уровень рекурсии для построения
level = 4
draw_koch_curve(level)
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKCmRlZiBrb2NoX2N1cnZlKHgsIHksIGxlbmd0aCwgYW5nbGUsIG4pOgogICAgaWYgbiA9PSAwOgogICAgICAgIGR4ID0gbGVuZ3RoICogbnAuY29zKG5wLmRlZzJyYWQoYW5nbGUpKQogICAgICAgIGR5ID0gbGVuZ3RoICogbnAuc2luKG5wLmRlZzJyYWQoYW5nbGUpKQogICAgICAgIHJldHVybiBbW3gsIHggKyBkeF0sIFt5LCB5ICsgZHldXQogICAgZWxzZToKICAgICAgICBzZWdtZW50cyA9IFtdCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CiAgICAgICAgICAgIG5ld194LCBuZXdfeSA9IHgsIHkKICAgICAgICAgICAgaWYgaSAlIDIgPT0gMDoKICAgICAgICAgICAgICAgIGFuZ2xlICs9IDYwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhbmdsZSAtPSAxMjAKICAgICAgICAgICAgbmV3X3NlZ21lbnRzID0ga29jaF9jdXJ2ZShuZXdfeCwgbmV3X3ksIGxlbmd0aCAvIDMsIGFuZ2xlLCBuIC0gMSkKICAgICAgICAgICAgeCwgeSA9IG5ld19zZWdtZW50c1swXVstMV0sIG5ld19zZWdtZW50c1sxXVstMV0KICAgICAgICAgICAgc2VnbWVudHMuZXh0ZW5kKG5ld19zZWdtZW50cykKICAgICAgICByZXR1cm4gc2VnbWVudHMKCmRlZiBkcmF3X2tvY2hfY3VydmUobGV2ZWwpOgogICAgcGx0LmZpZ3VyZShmaWdzaXplPSg4LCA4KSkKICAgIHBsdC5heGlzKCdlcXVhbCcpCiAgICBwbHQuYXhpcygnb2ZmJykKICAgIHN0YXJ0X3gsIHN0YXJ0X3kgPSAtMSwgLTAuNQogICAgbGVuZ3RoID0gMwogICAgYW5nbGUgPSAwCiAgICBzZWdtZW50cyA9IGtvY2hfY3VydmUoc3RhcnRfeCwgc3RhcnRfeSwgbGVuZ3RoLCBhbmdsZSwgbGV2ZWwpCiAgICBmb3Igc2VnbWVudCBpbiBzZWdtZW50czoKICAgICAgICBwbHQucGxvdChzZWdtZW50WzBdLCBzZWdtZW50WzFdLCBjb2xvcj0nYmx1ZScpCiAgICBwbHQuc2hvdygpCgojINCj0LrQsNC20LjRgtC1INGD0YDQvtCy0LXQvdGMINGA0LXQutGD0YDRgdC40Lgg0LTQu9GPINC/0L7RgdGC0YDQvtC10L3QuNGPCmxldmVsID0gNApkcmF3X2tvY2hfY3VydmUobGV2ZWwp