Definieer een klasse Punt waarmee punten kunnen voorgesteld worden in het tweedimensionale Euclidische vlak. Bij het aanmaken van een punt \((x, y)\) (Punt) moeten twee argumenten doorgeven worden: i) de \(x\)-coördinaat (int) van het punt en ii) de \(y\)-coördinaat (int) van het punt.

Definieer een klasse Rechthoek waarmee rechthoeken kunnen voorgesteld worden in het tweedimensionale Euclidische vlak. Bij het aanmaken van een rechthoek (Rechthoek) moeten drie argumenten doorgeven worden: i) het punt \(p\) (Punt) in de linkerbovenhoek van de rechthoek, ii) de breedte \(b\) (int) van de rechthoek en iii) de hoogte \(h\) (int) van de rechthoek. Hierbij moet gelden dat \(b,h > 0\). Indien dat niet het geval is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige rechthoek. Rechthoeken (Rechthoek) moeten minstens de volgende methoden ondersteunen:

Als een punt (Punt) of een rechthoek (Rechthoek) doorgegeven wordt aan de ingebouwde functies repr of str, dan moet een stringvoorstelling (str) van het punt of de rechthoek teruggegeven worden die leest als een Python expressie waarmee een punt of een rechthoek op dezelfde positie aangemaakt wordt.

Voorbeeld

>>> p = Punt(3, 4)
>>> p
Punt(3, 4)
>>> print(p)
Punt(3, 4)

>>> r1 = Rechthoek(Punt(1, 1), 8, 5)
>>> r2 = Rechthoek(Punt(2, 3), 9, 2)
>>> r1
Rechthoek(Punt(1, 1), 8, 5)
>>> print(r2)
Rechthoek(Punt(2, 3), 9, 2)
>>> r1.oppervlakte()
40
>>> r1.omtrek()
26
>>> r1.rechtsonder()
Punt(9, 6)
>>> r1.overlap(r2)
Rechthoek(Punt(2, 3), 7, 2)
>>> r2.overlap(Rechthoek(Punt(0, 0), 2, 2))

>>> Rechthoek(Punt(3, 4), -2, 7)
Traceback (most recent call last):
AssertionError: ongeldige rechthoek