Я пытаюсь написать алгоритм с использованием черепахи.
Черепаха подпрыгивает в многоугольнике и закрашивает часть края, которого касается. Алгоритм должен завершить работу, как только на границе многоугольника не останется незакрашенных областей.
Для этого мне нужно проверить каждый край многоугольника и определить, полностью ли он закрашен.
Есть ли такая функция в библиотеке черепахи? Если нет, то какой простой способ это определить? Многоугольник не обязательно прямолинейный.
Вот MWE:
Я пытаюсь написать алгоритм с использованием черепахи. Черепаха подпрыгивает в многоугольнике и закрашивает часть края, которого касается. Алгоритм должен завершить работу, как только на границе многоугольника не останется незакрашенных областей. Для этого мне нужно проверить каждый край многоугольника и определить, полностью ли он закрашен. Есть ли такая функция в библиотеке черепахи? Если нет, то какой простой способ это определить? Многоугольник не обязательно прямолинейный. Вот MWE: [code]import turtle from sympy import Segment, Point, Ray, N from mpmath import radians
def completely_painted(e): a.goto(N(e.p1.x), N(a.p1.y)) a.setheading(a.towards(N(e.p2.x), N(e.p2.y))) a.goto(N(e.p2.x), N(e.p2.y)) #if a passed through non-painted part: # return False return True
def all_edges_painted(): for e in E: if not completely_painted(e): return False return True
t.penup() t.goto(p1) t.pendown() for p in [p2, p3, p4, p1]: t.goto(p) t.penup() t.goto(5,5) t.setheading(60) t.pendown() pos = Point(t.pos()) vec = Ray(pos, angle=radians(t.heading())) ctr = 0 k = 0 p = -1 turtle.tracer(True) t.speed(10) a.color('red') while True: for e in E: intersections = vec.intersection(e) if len(intersections) > 0: hit = None for i in intersections: if isinstance(i, Point): hit = i if hit == None: continue
ln = e.perpendicular_line(hit) pt = ln.projection(pos) normal = Ray(hit, pt) t.goto(hit) paint(e, N(hit)) rotate = 2 * t.towards(pt.x, pt.y) - 180 - t.heading() t.setheading(rotate) if k == 0: k = 1 elif k == 1: k = 0 pos = Point(t.pos()) vec = Ray(pos, angle=radians(t.heading())) if ctr >= 50: # this should be if all_edges_painted() break ctr += 1
turtle.exitonclick() turtle.done() [/code] Я закомментировал те части, где используется метод проверки того, все ли края покрыты.