Koordinatensystem - Probleme mit dem Auslesen (MySQL)

String

Erfahrenes Mitglied
Hallo zusammen,

Bei unserem Browsergame benutzen wir ein Koordinatensystem (höhö, wer hätte das gedacht..).

Beispiel:
SQL-Tabelle Häuser:
ID, X, Y, GX, GY
1, 1, 1, 2, 2
2, 1, 3, 1, 1

X/Y ist klar, sind die Koordinaten. GX und GY sind die großen. Also das erste Haus ist 2x2 Felder groß. Klickt der User also auf das Feld 2/2 oder 1/2 kann ich ja nicht aus der DB auslesen WHERE x = $x AND y=$y.

Ich habe es schon so versucht:
PHP:
WHERE 
(($x BETWEEN x+gx-1 AND x) OR ($x+gx-1 BETWEEN x-gx+1 AND x))
AND
(($y BETWEEN y+gy-1 AND y) OR ($y+gy-1 BETWEEN y+gy-1 AND y))

Also gx-1, da x plus gx ja 3 ist, aber es nur um 1 erhöht werden muss.

Aber das will irgendwie überhaupt nicht funktionieren... Da fehlt mir wiedermals die Logik und ich hoffe mir kann da jemand weiter helfen ;)

paD
 
Wie sieht es mit einer einfachen Differenzrechnung aus?

Code:
WHERE ($x-x-gx)>gx AND ($y-y-gy)>gy
dient nur als hingekliertes Beispiel und kann logisch falsch sein (nachdenken ist erforderlich ;)), sieht aber besser aus als diese Between/AND/OR-Arie..

mfg chmee
 
Zuletzt bearbeitet:
Also ich habe jetzt hin und her getestet..Aber ich komme zu keinem Ergebnis. Google ich nach Differenzrechnung und Koordinatensystem scheint es einen Weg zu geben. Aber das in mein Beispiel zu integrieren schaff ich nicht :(

Bei klick auf 2/2
$x-x-gx bedeutet:
2-1-2 > 2
-1 > 2, also negativ, auch wenn das was steht.

Irgendwie fehlt mir leider immer noch so der zündende Funken :(

paD
 
Kurz gesagt, den Weg des Klicks zum nächsten Haus ausrechnen?
Hilft mir aber doch nur in soweit, dass ich ausrechnet, welches Haus der nächste sein könnte.

Da aber nicht alle Koordinaten gespeichert werden, hilft mir das doch nicht, oder?

Ein Haus, welches auf 2/2 gebaut wurde und 3x3 groß ist belegt die Koordinaten:
2/2, 2/3, 2/4 - 3/2, 3/3, 3/4 - 4/2, 4/3, 4/4

Gespeichert werden aber nur die 2/2 und die Größe, also 3/3.
Klicke ich nun auf 4/2 könnte auch ein Haus auf 4/1 gemeint sein (laut Dijkstra)..?

paD
 
Differenzrechnung heisst ja nur, dass Du nicht die Positionen an sich vergleichst, sondern die Differenzen - das Ergebnis einer Subtraktion..

Ich sagte ja schon, da ist mit Sicherheit einn logischer Fehler drin, ich habs nur hingekritzelt. Wir nehmen nochmals ein Beispiel. Deine Position (1)

Haus an Position 1,1 mit Größe 2,2
Somit sollte man ein Signal bekommen, wenn man im Bereich 1,1 bis 2,2 anklickt. Das Signal kann entweder heissen, rufe Eigenschaften von Objekt (id) 1 auf oder Nein, Hier kannst Du nicht bauen. Mit der Differenz holen wir uns den gültigen Wertebereich. Wir nehmen nur eine Dimension, denn die zweite wird gleichermaßen sein.

Bei Xjetzt=1 und 2 soll es ein true sein, bei Werten darunter und darüber nicht.

Xjetzt - Xhaus < Xgröße

Xjetzt =0 -> 0-1 < 2 -> -1<2 true
Xjetzt =1 -> 1-1 < 2 -> 0<2 true
Xjetzt =2 -> 2-1 < 2 -> 1<2 true
Xjetzt =3 -> 3-1 < 2 -> 2<2 false

So, da sehen wir nun zwei Fehler
(A) Das "größer als" musste ein "kleiner als" werden. (schon beachtet)
(B) wenn Xjetzt "kleiner als" Xpos ist, ist es auch true.

Die simple Lösung für (B) wäre, eigentlich, wie Du es auch hattest, zwei Bedingungen zu setzen, nämlich zusätzlich zur oberen ein AND (Xjetzt-Xhaus)>-1, dann wäre also die Bedingung (für eine Dimension)
Code:
WHERE (Xjetzt-Xhaus)<Xgröße AND (Xjetzt-Xhaus)>-1
vice versa für die Y-Dimension und deren Variablen. Tatsächlich werden wir auch 4 Bedingungen setzen, alle mit AND, denn ALLE müssen erfüllt sein, um das Signal zu geben.

mfg chmee

(Und ich bin mir sicher, es gibt noch eine Lösung mit nur einer Bedingung pro Dimension, bin aber grad nach dem Mittagessen und denkschwach ;))
 
Hey, dass muss die gleiche Sekunde gewesen sein :D

Okay, gut. Ich hab mal ein bisschen hin und her gespinnt mit deinem Script.
Also selbst bei eigenen Häusern auf der Karte funktioniert deine Vorgehensweise auch.
Die Abfrage wird, ohne es groß zu testen, mit Sicherheit auch schneller sein als mein BETWEEN Mist.

Wäre es jetzt noch möglich, dass ohne AND für eine Dimension zu lösen wäre es absolut genial :)

paD
 
Hab das jetzt mal so eingebaut.
Funktioniert super und ist bei 1000 Durchläufen auch sage und schreibe 1,534 Sek schneller :)

Ich setz mal auf erledigt, aber 100% zufrieden bin ich noch nicht, wenn man mir sagt, es geht wahrscheinlich noch einfacher :)

paD
 
Eine Idee wäre (wenns geht) die Subtraktion mittels eines Alias nur einmal durchzuführen. Ausprobieren.

Code:
(Xjetzt-Xhaus) as Xdiff

(interessant wäre es, wie lange das 1000xfache Durchgehen denn grundsätzlich braucht, dann hat die Aussage 1,5Sek auch einen definierbaren Wert :))

mfg chmee
 
Zuletzt bearbeitet:
Das mit dem Alias habe ich schon versucht, funktioniert leider nicht.
Das Script mit dem Between lieft im Schnitt ca. 6,5 Sekunden (mit 1000 Abfragen)
Und das errechnete knappe 4. Hab es 10 mal pro Script laufen lassen und die Mittelwerte genommen.

paD
 
Zurück