Irgendwas stimmt momentan nicht und ich komme nicht dahinter, was. Prinzipiell hab ich mir überlegt, dass ich mir ja die obere linke Ecke (bzw irgendeine, ist ja erstmal egal) aussuche und vergleiche. Da kam ich allerdings schon zu einer relativ langen, ekligen if Bedingung, die man mit Sicherheit auch schöner ausdrücken kann - abgesehen davon, ist sie auch falsch.
Mein Code ist hier:
Code: Alles auswählen
class Rechteck:
#Rechteck besteht aus den Koordinaten des Mittelpunktes, der Länge l und der Breite b
def __init__(self, cx, cy, l, b):
self.cx = cx
self.cy = cy
self.l = l
self.b = b
def __str__(self):
s = "[" + str(int(self.cx - self.b/2))+","+ str(int(self.cx + self.b/2)) +"] x ["+ str(int(self.cy - self.l/2))+"," + str(int(self.cy + self.l/2)) + "]"
return s
def schnitt(self,other):
#ls1 ist die linke,obere Ecke des ersten Rechtecks, angegeben durch den Mittelpunktx - Länge/2 und Mittelpunkty + breite/2 als Liste
ls1 = [self.cx - self.l / 2, self.cy + self.b / 2]
#ls2 ist die linke,obere Ecke des zweiten Rechtecks, gleiche Angabe als Liste
ls2 = [other.cx - other.l / 2, other.cy + other.b / 2]
# WENN die x Koordinate von Rechteck 1 kleiner als die von Rechteck 2 + breite von 2 ist UND
# WENN die x Koordinate von Rechteck 2 kleiner als die von Rechteck 1 + breite von 1 ist UND
# WENN die y Koordinate von Rechteck 2 kleiner als die von Rechteck 1 + länge von 1 ist UND
# WENN die y Koordinate von Rechteck 1 kleiner als die von Rechteck 2 + länge von 2 ist
#DANN returne TRUE
#SONST FALSE
if ls1[0] < ls2[0] + other.b and ls2[0] < ls1[0] + self.b and ls1[1] < ls1[1] + other.l and ls2[1] < ls1[1] + self.l:
return True
else:
return None
Außerdem hätte ich dann noch gern die Koordinaten, was bei dieser Methode relativ schwer ist, rauszulesen, fürchte ich. Da hab ich mir aber überlegt, wenn es TRUE ist, muss ich nochmal 4 Bedingungen implementieren, mit denen die Schnittpunkte der Breiten und Längen überprüft werden. Den Flächeninhalt kann ich ja dann relativ einfach mit einer neuen Funktion machen
(zB def calcFI(self):
return(self.b*self.l)
Das ganze scheint mir allerdings so ineffizient zu sein... Hat vielleicht jemand von euch einen Hinweis, wie ich das besser machen könnte?
Liebe Grüße!