Laboration: Geometriska former
Det här laborationen går ut på att strukturera och implementera ett paket, med namnet
geometri, för fyllda geometriska former, som kan användas vid utritning i en Frame eller en Applet i Java.
Modellen är förenklad, se nedan, för att inte laborationen skall bli alltför omfattande. Det viktigaste med laborationen är strukturering
och de Java-begrepp som behövs. Den givna modellen skall dock implementeras komplett.
Varje geometrisk form (GeometricalForm)
innehåller: bredden och höjden av den minsta rektangel,
som täcker in hela formen så snävt som möjligt,
en position och en färg.
De former som skall ingå och deras namn i bokstavsordning är:
- Circle Som anges genom sin diameter.
- Point Som anges genom sin position i pixlar,
enligt mönstret där origo är översta vänstra hörnet av ritytan och där x-axeln går åt höger och y-axeln går nedåt.
- Line Som anges genom att ge en start- och slut-punkt.
Notera att en linje i detta fall bör implementeras med hjälp av superklassens position, bredd och höjd.
Du behöver också en variabel som på något vis håller reda på linjens lutning (uppåt eller nedåt).
- Oval Som anges av sin bredd och höjd.
- Point Som anger en position i pixlar,
enligt mönstret där origo är översta vänstra hörnet av ritytan och där x-axeln går åt höger och y-axeln går nedåt.
- Rectangle Som anges av sin bredd och höjd.
- Square Som anges av sidans längd.
Gemensamt för alla former är:
- De har en position, som är positionen av det övre vänstra hörnet av den rektangel som täcker in formen så snävt som möjligt.
- De har en färg, angiven genom dess RGB-tal som en java.awt.Color.
- De har en area. Arean av en Point eller en Line är 0.
- De har en omkrets. Omkretsen av en Point är 0 och omkretsen av en Line är dess längd.
- De kan jämföras på storlek, som i första hand avgörs av dess area.
Om areorna är lika stora avgörs storleken av dess omkrets.
- De kan sinsemellan jämföras på likhet, som avgörs om alla delar är lika (även typen), förutom positionerna för de två formerna.
Notera att alla mått ges i antal pixlar och vid behov avrundas alltså beräkningarna till heltal.
Allt detta leder fram till följande gränssnitt. Anges nedan utan kommentarer, (fullständig API,
java-kod).
import java.awt.*;
public interface GeometricalForm extends Comparable<GeometricalForm> {
public void fill(Graphics g);
public Color getColor();
public int getArea();
public int getHeight();
public int getPerimeter();
public int getWidth();
public int getX();
public int getY();
public void move(int dx, int dy) throws IllegalPositionException;
public void place(int x, int y) throws IllegalPositionException;
}
Vidare skall två former av konstruktorer implementeras, en form där positionen anges med dess koordinater och en form där det nya objektet skall ha samma position som en given
GeometricalForm:
public Circle(int x, int y, int diameter, Color c) throws IllegalPositionException
public Circle(GeometricalForm f, int diameter, Color c)
public Line(int x1, int y1, int x2, int y2, Color c) throws IllegalPositionException
public Line(GeometricalForm f1, GeometricalForm f2, Color c)
public Oval(int x, int y, int width, int height, Color c) throws IllegalPositionException
public Oval(GeometricalForm f, int width, int height, Color c)
public Point(int x, int y, Color c) throws IllegalPositionException
public Point(GeometricalForm f, Color c)
public Rectangle(int x, int y, int width, int height, Color c) throws IllegalPositionException
public Rectangle(GeometricalForm f, int width, int height, Color c)
public Square(int x, int y, int side, Color c) throws IllegalPositionException
public Square(GeometricalForm f, int side, Color c)
Slutligen skall vi vid uppkomst av illegala positioner använda oss av klassen
IllegalPositionException (API,
java-kod), som ni definierar i ert paket. Ni får inte modifiera den givna definitionen.
Uppgiften delas upp i två delar, specifikationsdel och en imlementeringsdel.
- Definiera alla klasser, variabler, konstruerar- och metodhuvuden i paketet och lämna in dem via Fire för godkännande. Välj också lämpliga synlighetsgrader. Vidare skall alla
public- och eventuella protected-deklarerade enheter ha javadoc-kommentarer.
Tips: ta reda på hur taggen @inheritDoc fungerar i javadoc och hur
@Override fungerar i eclipse Gör allt detta innan du börjar implementera metoderna!
Obs: Du behöver inte ta bort paket-tillhörigheten för denna laboration, men paketet skall heta:
package geometri;
- Implementera paketet fullständigt och testkör via programmet MoveToUpperLeftCorner
(java-kod, API),
som du kopierar till lämplig plats.
Du kan se hur det skall fungera genom att hämta filen moveToUpperClassFiles.zip, göra unzip på filen och sedan exekvera via java MoveToUpperLeftCorner.
Den färdiga koden lämnas in via Fire.
|