Tillstånd i 3D animering

Denna övning handlar om att göra om 3D kub exemplet från onsdagens föreläsning, vecka 6.

Magnus Myreen, septermeber 2016.

Filer

Du får filerna som användes i föreläsningen den 4.10:

Kör programmet med att köra main i Main.java.

Uppgift 1

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?

Uppgift 2

Ä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.

Uppgift 3

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...)

Uppgift 4

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);