class Point:
"""
Die ist ein Punkt auf den Koordinaten x, y
"""
def __init__(self, x: float, y: float):
"""
Erzeugt einen Punkt auf den Koordinaten x und y
:param x: Horizontale Komponente
:param y: Vertikale Komponente
"""
self.__x = x
self.__y = y
@property
def x(self) -> float:
return self.__x
@x.setter
def x(self, x: float):
self.__x = x
@property
def y(self) -> float:
return self.__y
@y.setter
def y(self, y: float):
self.__y = y
def __str__(self) -> str:
return f"({round(self.x)}|{round(self.y)})"
class Cuboid:
"""
Das ist ein Quadrat mit der Seitenlänge 2*u
"""
def __init__(self, u):
"""
Erzeugt ein Quadrat mit 4 Eckpunkten und der Seitenlänge 2*u
:param u: entspricht demnach einer halben Seitenlänge
"""
self.points = [
Point(u, u),
Point(-u, u),
Point(u, -u),
Point(-u, -u)
]
def scale(self, f: float) -> None:
"""
Skaliert die Kompenenten der Eckpunkte um den Faktor f
:param f: Skalierungsfaktor
"""
for p in self.points:
p.x = p.x * f
p.y = p.y * f
@property
def area(self) -> float:
"""
Berechnet die Fläche und gibt sie retour.
:return: Fläche
"""
p = self.points[0]
return round(2 * p.x * 2 * p.y)
def __str__(self) -> str:
points = ",".join([str(p) for p in self.points])
return f"Fläche: {self.area}, Punkte: {points}"
class Circle:
"""
Kreis mit Radius u
"""
def __init__(self, u: float):
"""
Erzeugt ein Kreis mit dem Radius u.
:param u: Radius
"""
self.__radius = u
@property
def radius(self) -> float:
return round(self.__radius)
def scale(self, f: float) -> None:
"""
Skaliert den Radius um den Faktor f
:param f: Skalierungsfaktor
"""
self.__radius *= f
@property
def area(self) -> float:
"""
Berechnet die Fläche und gibt sie retour.
:return: Fläche
"""
r = self.__radius
PI = 3.142
return round(PI * r * r)
def __str__(self) -> str:
return f"Fläche: {self.area}, Radius: {self.radius}"
class CircleCuboid():
"""
Quadrat mit Inkreis und der Seitenlänge 2*u
"""
def __init__(self, u: float):
"""
Erzeugt ein Quadrat mit Inkreis
:param u: Radius des Inkreises
"""
self.__circle_ref = Circle(u)
self.__cuboid_ref = Cuboid(u)
@property
def circle(self): return self.__circle_ref
@property
def cuboid(self): return self.__cuboid_ref
def scale(self, f):
"""
Skaliert die Komponenten um den Faktor f
:param f: Skalierungsfaktor
"""
self.__circle_ref.scale(f)
self.__cuboid_ref.scale(f)
@property
def area_difference(self):
"""
Berechnet die Flächendifferenz der beiden Komponenten und gibt sie retour.
:return: Flächendifferenz
"""
return round(self.__cuboid_ref.area - self.__circle_ref.area)
def __str__(self):
return f"Kreiseck: " + \
f"\n\tKreis -> {self.circle}" + \
f"\n\tEck ---> {self.cuboid}" + \
f"\n\tDie Flächendifferenz ist {self.area_difference}"
if __name__ == '__main__':
print("Darstellung der Klasse 'Punkt' anhand von zwei Beispielen:")
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1, p2)
print("\nKreis-Eck Demo:")
cc = CircleCuboid(3)
print(cc)
factor = 20
cc.scale(factor)
print(f"\nEs wurde um den Faktor {factor} skaliert")
print(cc)