also müssen alle schnittpunkte überprüft werden, um
eindeutig zu verifizieren, ob ein polygon im anderen liegt.
hab im übrigen auch ne neue "point_collide" geschrieben.
Code: Alles auswählen
def point_collide(self, p):
# zuerst werden alle linien, die komplett
# überhalb oder unterhalb des punktes liegen
# ausgeschlossen, so dass nurnoch linien übrigbleiben,
# deren einer Punkt unterhalb des Punktes, und deren anderer
# Punkt überhalb des Punktes liegen.
# dann wird geschaut, wieviele der linien rechts, bzw links
# von dem Punkt liegen. Ist diese Zahl ungerade,
# so liegt der Punkt im Polygon, ist sie gerade, so liegt der
# Punkt ausserhalb des Polygons.
# Eckpunkte auf gleicher höhe wie der Punkt, werden dabei als
# darüber-liegend angesehen.
_count = 0
for l in self.sides():
# diesen Teil vielleicht wieder raus.
if any(p == point for point in self):
return False
# ----------------------------------------
# der hauptteil --------------------------
elif (l[0][1] <= p[1] and l[1][1] > p[1]) or\
(l[0][1] > p[1] and l[1][1] <= p[1]):
_s = left_or_right(l, p)
if _s == "mid":
return False
elif _s == "right":
_count += 1
# ----------------------------------------
# diesen Teil vieleicht wieder raus.
# dieser block ist ausschließlich dafür da,
# um zu verhindern, das Punkte, die auf einer der unteren
# Linien des Polygons liegen, als im Polygon befindlich
# ausgegeben werden.
# Daher wäre es sinvoll, einen Weg zu finden,
# das direkt im oberen Teil zu machen.
elif radian(l[0], l[1]) == radian(l[0], p):
if distance(l[0], l[1]) > distance(l[0], p):
return False
# -----------------------------------------
if _count % 2 == 0:
return False
return True
def collide_any(self, points):
return any(self.point_collide(point) for point in points)
def polygon_collide(self, polygon):
return polygon.collide_any(self) or self.collide_any(polygon)