3.8 KiB
Tilstand og oppførsel – Rectangle
Oppgaven handler om en Rectangle-klasse, som håndterer et firkantet område i et koordinatsystem, med sider parallelle med koordinataksene.
Tilstanden i Rectangle-objekter er ikke spesifisert eksplisitt, men må velges slik at metodene nedenfor kan implementerers. Merk at alle metodene jobber med heltallsstørrelser.
Rectangle-klassen har metoder for å spørre om tilstanden og endre tilstanden. Spørremetodene dekker høyde og bredde og koordinatene til øverste venstre og nederste høyre hjørne og om rektanglet inneholder spesifikke punkt(er). Endringsmetodene dekker utviding ved å legge til punkter.
Logikken til metodene må tilfredsstille følgende krav:
- Når en utvider et
Rectangle-objekt med en avadd-metodene, så skal ikke rektanglet bli større enn nødvendig, dvs. at dersom man må utvide rektangelet skal det bare utvides slik at det akkurat inneholder det nye punktet. - Et rektangel er tomt dersom enten bredden eller høyden er 0.
Konstruktører:
Rectangle(int x1, int y1, int x2, int y2)- Lager et minst mulig rektangel som inneholder både punktene(x1, y1)og(x2, y2)
Spørremetoder:
int getMinX()ogint getMinY()- returnerer henholdsvisx- ogy-koordinatene til punktet med lavest(x,y)-verdier som er inneholdt i dette rektanglet.int getMaxX()ogint getMaxY()- returnerer henholdsvisx- ogy-koordinatene til punktet med høyest(x,y)-verdier som er inneholdt i dette rektanglet.int getWidth()ogint getHeight()- returnerer henholdsvis bredden og høyden til rektanglet. Begge skal returnere0, dersom dette rektanglet er tomt.boolean isEmpty()- returnerertrueom rektanglet er tomt, dvs. om bredden og/eller høyden er0.boolean contains(int x, int y)- returnerertrueom punktet(x,y)er inneholdt i dette rektanglet, ogfalseellers.boolean contains(Rectangle rect)- returnerertrueom helerect, dvs. alle hjørnepunktene irect, er inneholdt i dette rektanglet, og false ellers.
Endringsmetoder:
boolean add(int x, int y)- utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder punktet(x,y). Returnerertrueom dette rektanglet faktisk ble endret, ellersfalse.boolean add(Rectangle rect)- utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder helerect-argumentet. Returnerertrueom dette rektanglet faktisk ble endret, ellersfalse. Dersomrecter tomt, så skal dette rektanglet ikke endres.
Andre metoder:
Rectangle union(Rectangle rect)- returnerer et nyttRectangle-objekt som tilsvarer kombisjonen av dette rektanglet ogrect-argumentet. Alle punktene som finnes i ett av rektanglene skal altså være inneholdt i rektanglet som returneres.
Java-kode
Skriv Java-kode for Rectangle-klassen med oppførsel som er beskrevet over.
Lag en passende toString()-metode og et hovedprogram, slik at du kan sjekke at oppførselen stemmer med tilstandsdiagrammet (bruk samme sekvens av kall).
Testkode for denne oppgaven finner du her: src/test/java/oving1/RectangleTest.java.
Ekstraoppgave
Implementer følgende metoder:
Rectangle intersection(Rectangle rect)- returnerer et nyttRectangle-objekt som tilsvarer overlappet mellom dette rektanglet ogrect-argumentet. Alle punktene som finnes i begge rektanglene skal altså være inneholdt i rektanglet som returneres. Dersom rektanglene ikke overlapper skalnullreturneres.boolean intersects(Rectangle rect)- returnerertrueom dette rektanglet ogrect-argumentet overlapper, dvs. om det finnes ett eller flere punkter som er inneholdt i begge disse rektanglene.
Testkode for ekstraoppgaven finner du her: src/test/java/oving1/RectangleExtraTest.java.