Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

05.01.2011, 20:57

Habe jetzt heute im Gespräch mit nem Arbeitskollegen eine einigermaßen zufriedenstellende Lösung gefunden. Vielleicht ist es ja für den ein oder anderen interessant.
Die beste Lösung wäre es eine Indizierung für die Knoten zu finden. Bei dem Problem mit den Koordinaten können natürlich die Koordinaten als Index in einer Hashmap oä benutzt werden. Beim Rubiks-Cube könnte man den Index aus den Feldern und Farben zusammensetzen. Die Idee(Die ohne mathematischen Beweis sinnvoll erscheint) setzt sich folgendermaßen zusammen:
Jedes Feld des Würfels stellt eine Stelle der Zahl dar. Jede Farbe bekommt einen Zahlenwert. Sagen wir mal Rot ist 1, Blau ist 2 und so weiter. Ist stelle 1 rot, ist die erste Zahl vom Index also 1. Ist die zweite Stelle blau kommt an die zweite Stelle eine Zwei. Ist die dritte wieder rot würde an Stelle 3 eine 1 kommen. Das macht man nun für jedes Feld des Würfels und hat hinterher einen Index mit 54 Stellen. Ist natürlich nicht besonders schön, liefert aber eindeutige Indizes. Die Werte müssen natürlich nicht direkt als eine Zahl gespeichert werden(Integer wäre dort ja eh nicht geeignet;) ), könnten jedoch auf mehrere kleinere Integer aufgesplittet werden. Wie auch immer man das jetzt genau umsetzen möchte. Ein bisschen Kreativität soll ja bleiben;)
So hätte man für eine Überprüfung eine Laufzeit von O(1).
Ansonsten könnte man die Liste aller Knoten durchlaufen und überprüfen ob der Knoten schon vorhanden ist. Habe da nochmal drüber nachgedacht und die Laufzeit hierfür wäre O(n) bei n Knoten, was auch ok wäre;)
Naja vielleicht hilfts ja irgendjemandem weiter.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

06.01.2011, 07:48

Ich versteh nicht, warum du Floodfill benutzen kannst, aber nicht jedem Knoten eine Position in einem 2D Array zuordnen kannst oO

Du hast meinetwegen einen Punkt und gehst von dem aus 5 Einheiten in jede Richtung, stößt du auf ein Hindernis, passiert nix, ansonsten erzeugst du an der neuen Stelle einen neuen Knoten und gehst wieder 5 Einheiten in jede Richtung, ja?
Dann musst du doch nur die Knotenposition durch 5 Teilen und hast die Position im 2D Array.
Was anderes wäre es natürlich, wenn du die Knoten auch schonmal leicht verschiebst, damit du nicht in einem Hindernis bist. Aber dann hast du zuersteinmal das Problem, zu definieren, wann 2 Knoten gleich sind, denn wenn du von dem verschobenen wieder 5 Einheiten zurückgehst, landest du ja bloß in der Nähe des Ursprungsknoten und musst dir dann überlegen, ob die gleich sein sollen, oder nicht.

Ansonsten kannst du auch eine Art Hashmap benutzen, indem du einfach in jedem Feld von dem Array eine Menge an Knoten speicherst, die bei Position/5 eben dort landen würde, das ist dann kaum langsamer.
Lieber dumm fragen, als dumm bleiben!

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

13

06.01.2011, 10:02

Du könntest auch einen Quadtree als Datenstruktur wählen.
Diese Lösung wäre vorallem bei einem großen Graph speichereffizienter als ein 2D Array und dabei auch noch recht performant.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

14

06.01.2011, 14:52


Jedes Feld des Würfels stellt eine Stelle der Zahl dar. Jede Farbe bekommt einen Zahlenwert. Sagen wir mal Rot ist 1, Blau ist 2 und so weiter. Ist stelle 1 rot, ist die erste Zahl vom Index also 1. Ist die zweite Stelle blau kommt an die zweite Stelle eine Zwei. Ist die dritte wieder rot würde an Stelle 3 eine 1 kommen. Das macht man nun für jedes Feld des Würfels und hat hinterher einen Index mit 54 Stellen. Ist natürlich nicht besonders schön, liefert aber eindeutige Indizes. Die Werte müssen natürlich nicht direkt als eine Zahl gespeichert werden(Integer wäre dort ja eh nicht geeignet;) ), könnten jedoch auf mehrere kleinere Integer aufgesplittet werden. Wie auch immer man das jetzt genau umsetzen möchte. Ein bisschen Kreativität soll ja bleiben;)
So hätte man für eine Überprüfung eine Laufzeit von O(1).
Hoert sich ziemlich bekloppt an. Erstmal ist 10^54 viel zu gross, da ein Cube weniger als 10^20 Stellungen hat. Beides trotzdem bissl zu gross, um es sinnvoll zu handlen. Das geht nur, wenn man man auch noch verschiedene Symmetrien und Eigentheiten ausnutzt.

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

07.01.2011, 11:54

Die Idee für die Indizes im Cube hatten wir, da dort durch ein bisschen denken zu erkennen ist, dass wirklich kein Index doppelt vergeben wird. Klar lässt sich hierfür sicherlich eine bessere Lösung finden, was aber ohne mathematischen Beweis nicht ohne weiteres funktionieren würde. Wenn ich nur mögliche Stellungen des Würfels als Index zulassen würde, müsste ich vorher überlegen bzw. vorberechnen welche Stellungen möglich sind. Genau das soll ja verhindert werden.
Und zum Floodfill. Klar, normalerweise wird er auf Arrays angewand. An sich sagt Floodfill jedoch nicht mehr aus als das ich in alle Richtungen gucke und dann mache was auch immer ich tun will. Da die Vektoren in meinem Fall float Werte haben, eignen sie sich nicht als Index in einem Array. ein Vektor A(5.3f, 7.8f) könnte zum Beispiel nicht ohne weiteres hierfür genutzt werden. Dann akzeptiere ich lieber die lineare Laufzeit beim durchsuchen der Knoten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

16

07.01.2011, 12:20

Doch, natürlich eignen sich die float Werte, weil sie ja alle ziemlich genau den selben Abstand haben (ist das jetzt so, oder nicht?). Ist doch nicht so schwer, durch die Entfernung zwischen den einzelnen Punkten zu teilen und dann zu runden, welche ganze Zahl am nächsten dran liegt.
Lieber dumm fragen, als dumm bleiben!

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

08.01.2011, 19:53

Würde sich auch eignen. Stimme ich dir zu.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige