AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Sichtbarkeit im Umkreis eines Objektes (Statement)
Thema durchsuchen
Ansicht
Themen-Optionen

Sichtbarkeit im Umkreis eines Objektes (Statement)

Ein Thema von stho · begonnen am 20. Dez 2010 · letzter Beitrag vom 21. Dez 2010
Antwort Antwort
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#1

Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 14:25
Datenbank: MySQL • Version: 5.0 • Zugriff über: -
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 14:29
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 14:31
Ups, du hast ja recht...
Ja, ich möchte die ID 3 angezeigt haben und die ID 2 NICHT.
mein Fehler

Bin wohl schon ein bisschen wirr im Kopf
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 14:35
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (20. Dez 2010 um 14:47 Uhr)
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 14:50
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 15:01
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^^)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (20. Dez 2010 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 15:17
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 [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 15:21
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
"WHERE T1.ID = :id " kann ich ja
"WHERE T1.ID in (SELECT ID FROM T1 WHERE UserID = 2)"

Geändert von stho (20. Dez 2010 um 15:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 20. Dez 2010, 16:34
Wieso nicht einfach
WHERE T1.UserID = 2
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Sichtbarkeit im Umkreis eines Objektes (Statement)

  Alt 21. Dez 2010, 10:02
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
ich dachte nicht, dass dieses Problem so "einfach" zu lösen sei
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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