Praktikum 3: unschön implementierte Tests

KaeferZuechter
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 108
Registriert: 15. Apr 2015 19:24

Praktikum 3: unschön implementierte Tests

Beitrag von KaeferZuechter »

Die Tests in der TestDeletePoint Klasse schlagen leider fehl, wenn man versucht, in place zu programmieren.
Das ist ein bisschen schade, da es die IMHO eleganteste Lösung verbietet. :(

Statt

Code: Alles auswählen

assertFalse("There is still an edge that ends in the deleted node",
e.getP1().equals(p23) || e.getP2().equals(p23));
müsste der Test an einer Stelle bspw. folgendermaßen heißen:

Code: Alles auswählen

assertFalse("There is still an edge that ends in the deleted node", 
e.getP1().equals(new Point(2, 3)) || e.getP2().equals(new Point(2, 3)));
Test auf gelöschten Punkt statt auf gelöschte Referenz also.
IT'S CALLED A FOURIER TRANSFORM WHEN YOU TAKE A NUMBER AND CONVERT IT TO THE BASE SYSTEM WHERE IT WILL HAVE MORE FOURS, THUS MAKING IT "FOURIER". IF YOU PICK THE BASE WHERE IS HAS THE MOST FOURS, THE NUMBER IS SAID TO BE "FOURIEST".

\(1160_8 \rightarrow 624_{10} \rightarrow 440_{12} \rightarrow 4444_5\)

- Zach Weiner -

hololol2
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 27. Apr 2015 14:13

Re: Praktikum 3: unschön implementierte Tests

Beitrag von hololol2 »

Die angegebenen Tests prüfen doch, ob noch Kanten im zu entfernenden Punkt enden. Das ist doch dann egal auf welche Weise des getestet wird, oder überseh ich grad was?

KaeferZuechter
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 108
Registriert: 15. Apr 2015 19:24

Re: Praktikum 3: unschön implementierte Tests

Beitrag von KaeferZuechter »

hololol2 hat geschrieben:Die angegebenen Tests prüfen doch, ob noch Kanten im zu entfernenden Punkt enden. Das ist doch dann egal auf welche Weise des getestet wird, oder überseh ich grad was?
Ja, du übersiehst was.
Der erste Test überprüft, ob es eine Kante auf die alte Referenz gibt, der zweite Test, ob es eine Kante auf den zu löschenden Knoten gibt.

Code: Alles auswählen

P12 = new Point(1,2);
PRef = P12;
PRef.x = 4;
PRef.y = 5;
assertFalse("P12 has not changed  ... ", PRef.equals(P12)); // Fails as same object, but should work as it is not the same point
Wer kurz nachdenkt wird auch verstehen, warum es günstig wäre Punkte verschieben zu dürfen.
IT'S CALLED A FOURIER TRANSFORM WHEN YOU TAKE A NUMBER AND CONVERT IT TO THE BASE SYSTEM WHERE IT WILL HAVE MORE FOURS, THUS MAKING IT "FOURIER". IF YOU PICK THE BASE WHERE IS HAS THE MOST FOURS, THE NUMBER IS SAID TO BE "FOURIEST".

\(1160_8 \rightarrow 624_{10} \rightarrow 440_{12} \rightarrow 4444_5\)

- Zach Weiner -

hololol2
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 27. Apr 2015 14:13

Re: Praktikum 3: unschön implementierte Tests

Beitrag von hololol2 »

Zwei Gründe wieso ich dein Problem immer noch nicht versteh:
1) Wieso solltest du einen Punkt verschieben wollen? Ein Punkt wird gelöscht, der Rest bleibt komplett gleich.
2) Die equals()-Methode ist in Point so implementiert:

Code: Alles auswählen

return this.x==p2.x && this.y == p2.y;
Sie gibt also wahr zurück, wenn beide Koordinaten gleich sind. Also sollten deine beiden Testvarianten keinen Unterschied ergeben

KaeferZuechter
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 108
Registriert: 15. Apr 2015 19:24

Re: Praktikum 3: unschön implementierte Tests

Beitrag von KaeferZuechter »

hololol2 hat geschrieben:Zwei Gründe wieso ich dein Problem immer noch nicht versteh:
1) Wieso solltest du einen Punkt verschieben wollen? Ein Punkt wird gelöscht, der Rest bleibt komplett gleich.
2) Die equals()-Methode ist in Point so implementiert:

Code: Alles auswählen

return this.x==p2.x && this.y == p2.y;
Sie gibt also wahr zurück, wenn beide Koordinaten gleich sind. Also sollten deine beiden Testvarianten keinen Unterschied ergeben

Wie lösche ich einen Punkt P aus einer konvexen Hülle?

Möglichkeit A:
- Ich lösche den Punkt, alle angrenzenden Kanten und Dreiecke und versuche anschließend das leere Polygon wieder zu triangulieren.
- Umständlich und mit dem vorgegebenen Design schwierig zu implementieren
Möglichkeit B:
- Ich wähle einen benachbarten Punkt Q, lösche die 2 benachbarten Dreiecke der Kante PQ und verschiebe P nach Q.
- Sehr einfach, sehr leicht zu implementieren, sehr effizient
Möglichkeit C:
- Ich wähle einen benachbarten Punkt Q, lösche die 2 benachbarten Dreiecke der Kante PQ und ersetze P durch Q.
- Einfach, leicht zu implementieren, ineffizient

Bei 2) liegst du einfach falsch. Wenn du einen Punkt verschiebst, verschiebst du gleichzeitig alle anderen Referenzen.
Sowohl P12 als auch PRef in meinem Beispiel zeigen auf (4, 5).


PS.: Mein Algorithmus funktioniert sehr gut und die Tests sind mit Möglichkeit C auch erfüllt. Ich bemängle nur, dass dieser Hack nötig ist, obwohl Möglichkeit B völlig korrekt ist.
IT'S CALLED A FOURIER TRANSFORM WHEN YOU TAKE A NUMBER AND CONVERT IT TO THE BASE SYSTEM WHERE IT WILL HAVE MORE FOURS, THUS MAKING IT "FOURIER". IF YOU PICK THE BASE WHERE IS HAS THE MOST FOURS, THE NUMBER IS SAID TO BE "FOURIEST".

\(1160_8 \rightarrow 624_{10} \rightarrow 440_{12} \rightarrow 4444_5\)

- Zach Weiner -

hololol2
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 27. Apr 2015 14:13

Re: Praktikum 3: unschön implementierte Tests

Beitrag von hololol2 »

OK. Die Idee für Möglichkeit b) hatte ich nicht. Deshalb hatte ich auch nicht verstanden, wieso du verschieben willst.
Ich bin mir nicht sicher, ob das so gemacht werden darf, deswegen sollte sich vllt jemand Offizielles mal äußern....

Antworten

Zurück zu „Archiv“