Denna övning handlar om att göra om 3D kub exemplet från onsdagens föreläsning, vecka 6.
Magnus Myreen, septermeber 2016.
Du får filerna som användes i föreläsningen den 4.10:
Drawable3D.java
: interface för 3D objekt som kan ritasLine3D.java
: en klass för sträck i 3D som är Drawable3D
Many3D.java
: en klass för samlingar som är Drawable3D
Point3D.java
: en klass för koordinater i 3DRotate2D.java
: metoder som kan rotera punkter i 2DMain.java
: programmet som visar en roterande kubKör programmet med att köra main
i Main.java
.
Editera Point3D.java
så att den skriver ut "Point3D created"
varje gång ett Point3D
objekt skapas.
Kör programmet för att se hur många som skapas. Hur många är det?
Ändra koden för koden så att utskriften säger hur många Point3D
objekt som har skapats. Exempel utskrift:
1 Point3D created
2 Point3D created
3 Point3D created
4 Point3D created
5 Point3D created
Tips: du behöver en klassvariabel (static
).
Kör programmet.
Varför skapas så många Point3D
objekt? När skapas de?
En kub behöver ju endast 8 punkter...
Din uppgift är att editera Point3D.java
så att den inte skapar mera en 8 Point3D
objekt för en kub. Tips: ändra på tillståndet (på engelska: state) istället för att hela tiden skapa nya instanser. Där den nu returnerar
return new Point3D(...);
ersätt detta med
... något här ...
return this;
så att metod signaturerna inte behöver ändras.
Får du det att fungera? Snurrar kuben snabbare? Varför? (Det beror inte på att koden skapar färre objekt...)
I Main.java
klassen finns det kommentarer:
// for two cubes, uncomment the following two lines
// cube = new Many3D(cube,cube.translate(160,0,0));
// shape = cube.translate(-90,0,0);
Ta bort //
från de två sista raderna. Ser du två kuber? Med orginal versionen av Point3D
ser man två.
Varför beter sig koden så underligt?
Din uppgift är att fixa koden så att programmet fungerar precis som orginal versionen, men utan att producera oändliga mängder Point3D
instanser. Lösningen kommer högst antagligen att skapa flera än 8 punkter, men det är okej. Fixa koden med hjälp av att implementera och använda clone
metoder där det behövs. En clone
metod för Point3D
klassen skulle se ut så här:
public Point3D clone() {
return new Point3D(x,y,z);
}
För att få testet med två kuber att fungera igen måste testet högst antagligen ändras lite så att det är:
cube = new Many3D(cube,cube.clone().translate(160,0,0));
shape = cube.translate(-90,0,0);