Bei einer links-rechts-Auswahl würde ich, wenn ich nach rechts will, erst einmal die kürzeste Distanz zum nächsten auf der rechten Seite ermitteln.
(Was links und rechts liegt wird man wahrscheinlich über positive und negative X-Differenz ermitteln. Das wäre eine einfache Abfrage.)
Die Distanz würde man über den Satz des Pythagoras ermitteln, mit dem XP/VX ja ohne weiteres umsetzbar.
Bei einer gleichen Distanz müsste man dann erst einmal den mit dem geringsten Abstand auf der X-Achse ermitteln, schließlich will man ja nach rechts und erwartet den anzuvisieren, der dann die kürzeste X-Distanz hat.
Bei gleicher Gesamt- und X-Distanz würde ich dann einfach von oben nach unten gehen, schließlich lesen wir ja auch von oben nach unten und haben deshalb wohl auch dieses Denkmuster.
Kurz:
Wenn nach rechts, dann -> kürzester Sqrt(x²+y²)-Abstand (-> kürzester X-Abstand (-> Y von oben nach unten)) -> Nächster gefunden
Insgesamt wohl weniger Mathematik, sondern mehr Abfragen.
Das Problem was ich bei deinem Ansatz sehe: Wenn ein Gegner nun nur wenige Pixel höher/tiefer sitzt als 2 andere, also praktisch als Beispiel mit mehr Zoom wie deine
würde ich mit nach rechts von 1 nach 3 wechseln wollen, aber nach einigen deiner Ansätze geht er dann auf 2. Hm. Dabei stehen sie nur leicht versetzt zu einander.
Ausserdem würde ich bei deinem ersten Beispiel intuitiv auf die 2 gehen wollen - aber ich kann mir auch Fälle vorstellen, wo ich eher mit oben/unten hantieren wollte.
Ich hätte da diverse Ansätze.
Der eine Ansatz ist soweit, das etwas unintuitiver zu machen, aber wers erklärt kriegt, würde da schnell reinkommen:
Konzentration auf eine Achse. Rechts: nächster Gegner auf der X-Achse, Links, nächster Gegner auf der X-Achse nach links.
Gegen den Fall
könnte man dann noch , falls ein "Nachbar" mit X-Abstand==0 den Y-Abstand checken und wenn der bei Rechts größer ist, dahin springen, und wenn er bei Links kleiner ist, dahin springen, ansonsten verwerfen und wirklich zum nächsten "echten" Nachbarn mit X-Abstand != 0 gehen.
Nicht ganz intuitiv in manchen Situationen, aber kommt man rein.
Würde dir auch Oben/unten für wechsel zwischen Charas und Gegnern lassen.
Andere Option die ich sehe ist Abwandlung von Rettans Vorschlag - du gehst erstmal nach dem euklidischen Abstand, prüfst aber je nach Richtung, ob der gefundene Kandidat nicht zu weit in eine entsprechende Richtung ausfällt, oder ob eine gewissen X/Y-Abstands-Verhältnis-Grenze nicht über/unterschritten wird. D.h. wenn im Fall
von der 1 die rechts kommt, findet er zwar 3, verwirft aber, da das x/y-abstandsverhältnis extrem (in dem fall unendlich) hoch ist, und geht auf 2, oder
würde bei der 1 auf Rechts auch die 3 gewählt werden, aber ist soweit von der 1 in der Y-Ebene entfernt, dass er auf die 2 springt.
Was für dich intuitiv ist oder nicht - dafür kannst du die Grenzwerte passend wählen.
Die Option halt ich zwar für mit die schönste, wenn auch extrem umständlich zu implementieren, einziges Problem wo man drüber nachdenken könnte: auch hierbei können durchaus Fälle auftreten, wo einzelne Punkte nicht erreicht werden können. Evtl kann man das auch durch entsprechende Grenzwertwahl umgehen, oder man sucht sich eine noch komplexere Option - so was wie ein Algorythmus der berechnet, welche Punkte nicht erreichbar sind und dann ggf. dynamisch die Grenzwerte hochsetzt/für einzelne Pfade damit der Punkt erreichbar werden kann (Erreichbarkeitsproblem für Graphen, wenn du die erreichbarkeit von Ziel auf Ziel mit einer Richtungseingabe als Graph betrachtest)? Was die implementierung nicht gerade unkomplizierter macht ~.~
Geändert von Todu (06.12.2011 um 01:33 Uhr)
Grund: Minigrafiken sahen im Quelltest anders aus als im Code-Format
Danke schonmal für die Antworten, die letzte Lösung gefällt mir soweit ganz gut.
Wenn man da als Grenzwert für das X/Y-Abstand-Verhältnis 1 nimmt, also quasi alles in Betracht zieht, was innerhalb eines 45° Winkels liegt, sollte eigentlich nichts unerreichbar werden, in meinem Beispiel mit der 5 in der Mitte wäre die 5 gerade noch am Rand der betrachteten Punkte und würde entsprechend gewählt werden.
Ich spiel das noch für ein paar Beispiele durch und wenns mir gefällt, freu ich mich auf die Implementierung :P