Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sichtbarkeit im Umkreis eines Objektes (Statement) (https://www.delphipraxis.net/156911-sichtbarkeit-im-umkreis-eines-objektes-statement.html)

stho 20. Dez 2010 13:25

Datenbank: MySQL • Version: 5.0 • Zugriff über: -

Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Hallo Leute,

Ich habe da kein kleines Problem...
Ich möchte eine SQL-Abfrage schreiben, mit der ich aus einer Tabelle von "Einträgen" alle in Umkreis von Z Feldern
herausbekomme.

Die Tabelle ist etwa so aufgebaut:

Table1:
-----------------------------
ID | X | Y | UserID | Radius
-----------------------------
1, | 1 | 1 | 2 | 2
2, | 5 | 6 | 3 | 1
3, | 3 | 3 | 3 | 1

-> Wie vielleicht schon vermutet geht es um ein Spiel an welchem ich arbeite.
Nun bin ich Spieler mit der UserID 2
Ich möchte am Ende das Objekt mit der ID 2 ausgelesen bekommen.
Meine Figur befindet sich an Position 1/1 mit einer sichtweite 2 (Dargestellt durch den Radius)
Somit soll sie alle Figuren finden, die sich im Radius -1/-1 bis 3/3 befinden...

Wichtig dazu ist noch zu wissen, dass jeder Spieler beliebig viele Figuren besitzen kann und diese beliebig größe sichtweiten haben...

Hat jemand eine Idee wie man so etwas lösen kann?

DeddyH 20. Dez 2010 13:29

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Wie kommst Du auf die ID 2? Du machst es doch an den Koordinaten fest, ob das Objekt sichtbar ist, oder? Wieso ist dann 5,6 für 1,1 sichtbar bei einem Radius von 2?

stho 20. Dez 2010 13:31

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Ups, du hast ja recht... :oops:
Ja, ich möchte die ID 3 angezeigt haben und die ID 2 NICHT.
mein Fehler :wink:

Bin wohl schon ein bisschen wirr im Kopf

DeddyH 20. Dez 2010 13:35

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Nicht sonderlich elegant, aber versuch einmal
SQL-Code:
SELECT
  ID
FROM
  Tabelle
WHERE
  X BETWEEN (
    SELECT
      X - Radius
    FROM
      Tabelle
    WHERE ID = :id)
  AND (
    SELECT
      X + Radius
    FROM
      Tabelle
    WHERE ID = :id)
AND
  Y BETWEEN (
    SELECT
      Y - Radius
    FROM
      Tabelle
    WHERE ID = :id)
  AND (
    SELECT
      Y + Radius
    FROM
      Tabelle
    WHERE ID = :id)
AND
  ID <> :id
Der Parameter :id entspricht jeweils der ID der aktuellen Spielfigur.

[edit] Falls das so funktioniert, würde ich es an Deiner Stelle aber in eine SP verfrachten, dann kann man die Min- und Max-Werte auf einen Schlag ermitteln und in Variablen packen, mit denen man dann vergleicht. Ist bestimmt performanter als die ganzen Subselects. [/edit]

stho 20. Dez 2010 13:50

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
joa, scheint so zu funktionieren...
Ich weiß nur nicht wie performant das ist, wenn man 100+ einheiten in der Liste hat ^^
Naja, aber irgendwo muss ich halt abspriche machen.
Das mit der SP probiere ich mal aus. Vielen Dank ;)

Neutral General 20. Dez 2010 14:01

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Vielleicht so:

SQL-Code:
SELECT
  tabelle.id
FROM tabelle
JOIN tabelle as tabelle_2 on (tabelle_2.id = :id)
WHERE (tabelle.x between (tabelle_2.x-tabelle_2.radius) and (tabelle_2.x+tabelle_2.radius))
  AND (tabelle.y between (tabelle_2.y-tabelle_2.radius) and (tabelle_2.y+tabelle_2.radius))
  AND (tabelle.id <> tabelle_2.id) -- Sich selbst nicht finden
Also bei mir funktionierts so! (Nachdem ich den Post hier ca. 10x editiert hab^^)

DeddyH 20. Dez 2010 14:17

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Oder anders formuliert:
SQL-Code:
SELECT
  T2.id
FROM
  tabelle T1
JOIN
  tabelle T2 
  ON T2.ID <> T1.ID
  AND T2.X BETWEEN (T1.X - T1.Radius) AND (T1.X + T1.Radius)
  AND T2.Y BETWEEN (T1.Y - T1.Radius) AND (T1.Y + T1.Radius)
WHERE T1.ID = :id
[edit] Na super, da editiert der hier rum, während ich noch tippe :tongue: [/edit]

stho 20. Dez 2010 14:21

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Mir raucht der Schädel :?
Naja, muss mich heute abend erstmal genauer damit befassen...
Aber die Ideen sind schonmal super ;)

EDIT:
Okay, verstanden habe ichs mittlerweile ^^
Aber gibt es eine Möglichkeit dieses Statement so umzubauen, dass es mir ALLE sichtbaren Objekte jedes meiner Objekte zurück gibt?
Oder komme ich um eine SP mit Schleife/Cursor nicht herum?

EDIT2:
Okay, habe die Lösung selber gefunden ^^
Anstatt
SQL-Code:
"WHERE T1.ID = :id "
kann ich ja
SQL-Code:
"WHERE T1.ID in (SELECT ID FROM T1 WHERE UserID = 2)"

DeddyH 20. Dez 2010 15:34

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
Wieso nicht einfach
SQL-Code:
WHERE T1.UserID = 2
:?:

stho 21. Dez 2010 09:02

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
 
hm... :|
Ich sollte es mir nicht immer so schwer machen wenn es auch einfach geht :(

Naja, vielen Dank für deine tatkräftige Unterstützung :thumb:
ich dachte nicht, dass dieses Problem so "einfach" zu lösen sei


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz