Как определить, полностью ли сегмент покрыт набором более мелких сегментов?Python

Программы на Python
Ответить
Anonymous
 Как определить, полностью ли сегмент покрыт набором более мелких сегментов?

Сообщение Anonymous »

Я пытаюсь написать алгоритм с использованием черепахи.
Черепаха подпрыгивает в многоугольнике и закрашивает часть края, которого касается. Алгоритм должен завершить работу, как только на границе многоугольника не останется незакрашенных областей.
Для этого мне нужно проверить каждый край многоугольника и определить, полностью ли он закрашен.
Есть ли такая функция в библиотеке черепахи? Если нет, то какой простой способ это определить? Многоугольник не обязательно прямолинейный.
Вот MWE:

Код: Выделить всё

import turtle
from sympy import Segment, Point, Ray, N
from mpmath import radians

turtle.setworldcoordinates(-1, -1, 11, 11)
paint_len = 1

def paint(e, hit):
print(hit)
turtle.tracer(False)
a.penup()
a.goto(hit)
a.setheading(a.towards(N(e.p1.x), N(e.p1.y)))
dist = min(N(Point(a.pos()).distance(e.p1)), paint_len/2)
a.forward(dist)
dist = min(N(Point(a.pos()).distance(e.p2)), paint_len)
a.setheading(a.towards(N(e.p2.x), N(e.p2.y)))
a.pendown()
a.forward(dist)
a.penup()
turtle.tracer(True)

t = turtle.Turtle()
a = turtle.Turtle()
a.hideturtle()
a.width(3)

turtle.tracer(False)
p1 = (0,0)
p2 = (10,0)
p3 = (10,10)
p4 = (0,10)
E = [Segment(p1, p2), Segment(p2,p3), Segment(p3,p4), Segment(p4,p1)]

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()
Я закомментировал те части, где используется метод проверки того, все ли края покрыты.

Подробнее здесь: https://stackoverflow.com/questions/718 ... set-of-sma
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»