Wie kann ich feststellen, ob ein Liniensegment vollständig von einer Reihe kleinerer Segmente bedeckt ist?Python

Python-Programme
Anonymous
 Wie kann ich feststellen, ob ein Liniensegment vollständig von einer Reihe kleinerer Segmente bedeckt ist?

Post by Anonymous »

Ich versuche, einen Algorithmus mit der Schildkröte zu schreiben.
Die Schildkröte hüpft in einem Polygon und malt einen Teil der Kante, die sie berührt. Der Algorithmus sollte beendet werden, sobald an der Grenze des Polygons keine unbemalten Bereiche mehr vorhanden sind.
Dazu muss ich jede Kante des Polygons überprüfen und feststellen, ob es vollständig bemalt ist.
Gibt es eine solche Funktion in der Turtle-Bibliothek? Wenn nicht, wie lässt sich dies dann auf einfache Weise feststellen? Das Polygon ist nicht unbedingt geradlinig.
Hier ist ein MWE:

Code: Select all

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()
Ich habe die Teile auskommentiert, in denen die Methode zur Überprüfung, ob alle Kanten abgedeckt sind, verwendet wird.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post