login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Navigeren dmv coordinaten

Offline Valkyr - 22/06/2009 22:01
Avatar van ValkyrNieuw lid Beste,

Ik heb een wereld gemaakt in mijn MYSQL database.
Alles opzich in orde maar ik kom even niet uit de navigate.

Ik wil nu met een query de juiste gegevens selecteren welke weergegeven moeten worden.

Als je naar jouw dorpje kijkt dan staat het gecentreerd dus bijvoorbeeld:

Ik weergeef 7 x 7 hokjes. 7 breed, 7 hoog dus in totaal 49 velden.
De coordinaten van mijn dorp zijn X-5 en Y-5 op de x-as en y-as.

Deze zal dus uiteraard in het midden van het beeld weergegeven worden in veldje 5, 5 (X-5, Y-5). Hoe weergeef ik nu het beste de velden er om heen? want deze zijn niet aansluiten natuurlijk.

Bijvoorbeeld:

[22][32][42][52][62][72][82]
[23][33][43][53][63][73][83]
[24][34][44][54][64][74][84]
[25][35][45][55][65][75][85]
[26][36][46][56][66][76][86]
[27][37][47][57][67][77][87]
[28][38][48][58][68][78][88]

Ik moet dus ranges selecteren van 22 t/m 28, en dan 32 t/m 38 en zo doende vanuit gaand het middel punt (denk ik?)...

zou iemand mij wat tips kunnen geven over hoe ik dit moet aanpakken want ik heb eigenlijk geen idee om eerlijk te zijn
want om nu 7 queries te maken voor elke rij, zal ook niet de ideale oplossing zijn denk ik toch ;)

Groetjes

9 antwoorden

Gesponsorde links
Offline Rik - 22/06/2009 22:54
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
  1. $sCenter = (string) 55;
  2. $iWidth = $iHeight = 7;
  3.  
  4. $aPerimeter = array(($iWidth - 1) / 2, ($iHeight - 1) / 2);
  5. $aCoordinates = array();
  6.  
  7. for ($i = -$aPerimeter[0]; $i <= $aPerimeter[0]; ++$i) {
  8. for ($j = -$aPerimeter[1]; $j <= $aPerimeter[1]; ++$j) {
  9. if ($i !== 0 && $j !== 0) {
  10. $aCoordinates[] = $sCenter[0] + $i . $sCenter[1] + $j;
  11. }
  12. }
  13. }
  14. print_r($aCoordinates);
En voor in je query kun je PHP.net: implode gebruiken icm een WHERE IN. Maar dat moet je maar melden als je er niet uit komt.  
Offline Valkyr - 22/06/2009 23:06 (laatste wijziging 23/06/2009 03:11)
Avatar van Valkyr Nieuw lid EDIT:

Kom er helaas niet uit mijn excuses.
Ik heb nu de volgende code:

Plaatscode: 136930

Ik krijg de uitkomst van mijn $coordinates:

Array ( [0] => -24 [1] => -23 [2] => -21 [3] => -20 [4] => -14 [5] => -13 [6] => -11 [7] => -10 [8] => 10 [9] => 11 [10] => 13 [11] => 14 [12] => 20 [13] => 21 [14] => 23 [15] => 24 )

Terwijl ik eigenlijk zou moeten hebben het volgende (5 bij 5)

[X0 Y0][X1 Y0][X2 Y0][X3 Y0][X4 Y0]
[X0 Y1][X1 Y1][X2 Y1][X3 Y1][X4 Y1]
[X0 Y2][X1 Y2][X2 Y2][X3 Y2][X4 Y2]
[X0 Y3][X1 Y3][X2 Y3][X3 Y3][X4 Y3]
[X0 Y4][X1 Y4][X2 Y4][X3 Y4][X4 Y4]

Waarbij de vetgedrukte (X2 Y2) in het midden van mijn beeld moet komen te staan. Ik heb gewoon 5 x 5 div's gemaakt waarin ik een

<?php echo '<img src="">'; ?> heb staan en het id van de bijbehorende coordinaat weergeeft dan een plaatje die bij dat hokje hoort. Maar goed, ik krijg nu dus niet de coordinaten zoals ik hierboven heb afgebeeld. Zo moet ik ze dus hebben. Het centrale punt, in dit geval X2, Y2 komt uit een URL link bijvoorbeeld dorp.php?x=2&y-2.

Ik ga nog even verder proberen maar heb weinig hoop, ik zit volgensmijn gewoon dom na te denken of te moeilijk haha. Hopelijk kan iemand het even voordoen voor me, sorry voor het ongemak!

P.S. mijn MYSQL table is als volgt opgemaakt (hieruit haal ik de veldjes dus!)

Plaatscode: 136931

Ik heb de x-as van links naar rechts, en de y-as van boven naar onder. Punt waar ik van uit ga is links bovenaan altijd.
Offline Rik - 23/06/2009 07:11
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Ah, ik dacht dat je van die coördinaten eromheen uit de database moest halen. Ik zal vanmiddag (als niemand anders eerder is) even kijken hoe ik het voor je moet aanpassen om te werken.
Offline Valkyr - 23/06/2009 12:46
Avatar van Valkyr Nieuw lid Oke echt super, mijn excuses voor de verkeerde uitleg... ik wacht je bericht af ;)

Alvast hartelijk bedankt Rik!
Offline Rik - 23/06/2009 14:23
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Probeer het zo eens.  
  1. echo '<pre>';
  2. /* Coördinaat van het midden */
  3. $sCenter = (string) 55;
  4. /* Afmetingen */
  5. $iWidth = 7; $iHeight = 7;
  6. /* Randbreedte berekenen */
  7. $aPerimeter = array(($iWidth - 1) / 2, ($iHeight - 1) / 2);
  8. /* Rijen afgaan */
  9. for ($i = -$aPerimeter[1]; $i <= $aPerimeter[1]; ++$i) {
  10. /* Kolommen afgaan */
  11. for ($j = -$aPerimeter[0]; $j <= $aPerimeter[0]; ++$j) {
  12. /* Coördinaat weergeven */
  13. printf($i === 0 && $j === 0 ? '[<strong>%d%d</strong>]' : '[%d%d]', $sCenter[1] + $j, $sCenter[0] + $i);
  14. }
  15. /* Volgende rij */
  16. echo PHP_EOL;
  17. }
  18. echo '</pre>';
Offline Valkyr - 23/06/2009 14:26 (laatste wijziging 23/06/2009 15:40)
Avatar van Valkyr Nieuw lid Gaan we nu meteen proberen ;)
Ik laat het dadelijk meteen even weten!


Volgensmijn klopt het nu inderdaad!
Ik ga het geheel er even in zetten als mij dat lukt en dan post ik het resultaat wel even.

Ga ik meteen even je code bestuderen want zitten wat nieuwe dingen voor me in ;)

Hartelijk dank voor je hulp!


EDIT: Bijna voor elkaar haha maar kom er toch niet uit. Mijn code nu is:

Plaatscode: 136936

Ik wil dus de achtergrond types (tile_1.png, tile_2.png enzovoort) uit de MYSQL halen en in de array zetten. Als ik nu var_dump doe geeft mijn array het volgende weer:

array(50) { ["id"]=> string(1) "1" [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) [3]=> bool(false) [4]=> bool(false) [5]=> bool(false) [6]=> bool(false) [7]=> bool(false) [8]=> bool(false) [9]=> bool(false) [10]=> bool(false) [11]=> bool(false) [12]=> bool(false) [13]=> bool(false) }

Dit is een kort gedeelte van de foutmelding, anders te lang om hier te plakken ;)
Offline Rik - 23/06/2009 15:37
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
PHP_EOL geeft afhankelijk van het OS een bepaalde enter weer.

%d staat voor het invoegen van een decimaal getal, kijk voor meer uileg bij PHP.net: sprintf

Wat je zegt over de if klopt:
statement ? doen_als_true() : doen_als_false();

Is de afkorting voor:
if (statement) {
doen_als_true();
} else {
doen_als_false();
}

Succes met dat stukje SQL, volgens mij doe je niets fout, dus dat zou vanzelf goed moeten komen.  Voor de snelheid zou je eventueel alles in één keer op kunnen halen.
Offline Valkyr - 23/06/2009 15:40 (laatste wijziging 23/06/2009 15:58)
Avatar van Valkyr Nieuw lid ja, ik blijf fouten krijgen in de MYSQL hahaha maar we blijven even proberen ;) we zijn er bijna (zie mijn EDIT hierboven)


EDIT:

Plaatscode: 136937

De query werkt niet schijnbaar, blijf een NULL terug krijgen als ik een var_dump doe op mijn $bg;   

Ben er wel achter gekomen dat dit het probleem is:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-6"' at line 1

Dit komt omdat ik RONDOM het centrale puint selecteer.
Ik selecteer vanaf het midden 3 velden omhoog, als er maar 2 velden in mijn database staan, dan begint hij met - (minus) te rekenen.

Hierdoor loopt hij in de QUERY dus vast, iemand enig idee hoe ik dit kan oplossen?

De query in een IF statement zetten van, als x-as en y-as groter of gelijk zijn dan 0 (nul) dan query doen anders een leeg veld in de array doen??? want ik kan niet gewoon even 1 veld overslaan want dan klopt de array niet meer met het aantal veldjes van 7x7 ;)
Offline Rik - 23/06/2009 16:11
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
  1. <?php
  2. echo '<pre>';
  3. /* Coördinaat van het midden */
  4. $sCenter = (string) 22;
  5. /* Afmetingen */
  6. $iWidth = 7; $iHeight = 7;
  7. /* Randbreedte berekenen */
  8. $aPerimeter = array(($iWidth - 1) / 2, ($iHeight - 1) / 2);
  9. /* Rijen afgaan */
  10. $i = max(0, $sCenter[1] - $aPerimeter[1]);
  11. $iMax = $sCenter[1] + $aPerimeter[1];
  12. for (; $i <= $iMax; ++$i) {
  13. /* Kolommen afgaan */
  14. $j = max(0, $sCenter[0] - $aPerimeter[0]);
  15. $jMax = $sCenter[0] + $aPerimeter[0];
  16. for (; $j <= $jMax; ++$j) {
  17. /* Coördinaat weergeven */
  18. printf($i == $sCenter[1] && $j == $sCenter[0] ? '[<strong>%d%d</strong>]' : '[%d%d]', $j, $i);
  19. }
  20. /* Volgende rij */
  21. echo PHP_EOL;
  22. }
  23. echo '</pre>';

Zo neemt hij als minimum coördinaat 00.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.442s