Speric Range (coordinate System) - Wrong Result

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Speric Range (coordinate System) - Wrong Result

    I hope the German PHP Gurus are not sleeping like the American Coders atm
    I have created a function which should notice if there is a Star in spheric range (distance = $gap (=20) of my analized star. It seems to find some stars but the result is really strange. (At bottom of the code)
    PHP-Code:
    function collision($db$x$y$z$gap){
        
    $collision false;
        
    $x_min $x-$gap$x_max $x+$gap;
        
    $y_min $y-$gap$y_max $y+$gap;
        
    $z_min $z-$gap$z_max $z+$gap;
        
        
    $sql 'SELECT x, y, z FROM stars 
                WHERE     x BETWEEN '
    .$x_min.' AND '.$x_max.
                AND     y BETWEEN '
    .$y_min.' AND '.$y_max.'
                AND     z BETWEEN '
    .$z_min.' AND '.$z_max;     
        
    $result $db->query($sql) or die (mysql_error());    
        
        while (
    $row $result->fetch_assoc()) {
            
    $dx $x-$row['x'];
            
    $dy $y-$row['y'];
            
    $dz $z-$row['z'];

            
    $distance sqrt($dx*$dx+$dy*$dy+$dz*$dz);
            
            if (
    $distance<$gap) {
                
    $collision true;    
                echo 
    '<br>There was a star in range at '.$x.'-'.$y.'-'.$z;
                break;
            }
        }
            return 
    $collision;

    I printed out the distances of the potencial in-range-stars to the analysing star and there comes results of that:
    (Differences x,y,z)
    19/2/-13
    19/2/-12
    19/2/-13
    19/1/-12
    -19/-2/12
    19/2/-13
    Distance is always between 22 and 24, not as expectet <20!
    It would be very kind, if you could help me with that dilema!
    Zuletzt geändert von Anutet; 18.10.2010, 21:15. Grund: sence mistake

  • #2
    Zitat von Anutet Beitrag anzeigen
    I hope the German PHP Gurus are not sleeping like the American Coders atm
    If you're American und your mother tongue is English, maybe it'd be better to wait until they're up again ...?

    I have created a function which should notice if there is a Star in spheric range (distance = $gap (=20)
    I think you'll have to elaborate quite a lot more on this ... don't expect everyone here to know about that kind of mumbo-jumbo.

    my analized star.
    Ouch. Doesn't that hurt ...?
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Spheres and cubes

      Hallo Anutet,

      actually it seems to me that there ist nothing wrong with your result.
      The point is that you mix up two different notions of "distance".

      Your database query ist based on the maximum norm. You consider
      a cube C with center ($x, $y, $z) and edge length 40.

      When you check for collisions you rely on the Euclidean distance.
      You take a ball B with center ($x, $y, $z) and radius 20.

      Your observation simply reflects the fact that the ball B is a proper
      subset of the cube C.
      Zuletzt geändert von mephisto111; 19.10.2010, 00:09.

      Kommentar


      • #4
        Zitat von wahsaga Beitrag anzeigen
        If you're American und your mother tongue is English, maybe it'd be better to wait until they're up again ...?
        Du hast komplett recht, meine Muttersprache ist Deutsch, jedoch hab ich dieselbe Frage zu vor in ein englisches Forum gepostet und durch die verflixte erfolglose Fehlersuche wurde ich ungeduldig. Ich entschuldige mich dafür - es tut mir leid und ich bemühe mich in Zukunft so etwas zu vermeiden.
        Your database query ist based on the maximum norm. You consider
        a cube C with center ($x, $y, $z) and edge length 40.

        When you check for collisions you rely on the Euclidean distance.
        You take a ball B with center ($x, $y, $z) and radius 20.
        Vielen vielen Dank Mephisto für deine Hilfe.
        Habe ich das richtig verstanden, dass du damit meinst (meine Englischkentnisse sind sehr schlecht ) dass du meinst ich kann $result nicht auf diese Weise verwenden um die richtigen Koordinaten rauszulesen bzw ich solle irgendwie gleich versuchen die Euklidische Formel anzuwenden?
        Code:
        Your observation simply reflects the fact that the ball B is a proper
        subset of the cube C
        Ich hätte mir es so gedacht dass ich mit der Select schon mal potenziell nahe Sterne "vorselektiere", den bei beispielsweise 5000 Sternen dauert mein ganzer Algorithmus viel zu lange. Aus diesem gewonnenen Würfel (der wie du sagst stimmen sollte) wollte ich dann die Kugel rauslesen und jene, welche sich nicht darin befinden rauszulöschen ($distance > 20)

        Kommentar


        • #5
          ne, er meint einfach, dass deine Abfrage einen Würfel umschreibt , mit 40 Kantenlänge , der hat aber ein größeres Volumen und damit auch größere Diagonalen als eine Kugel mit Radius 20 (da ist eben bei 20 Schluß)

          also musst du die Punkte umrechnen ..mitm doppelten Pythagoras

          x²+y²=b² , und b²+z²<=20² -> x²+y²+z²<=400 , wobei x,y,z den jeweiligen linearen Abständen auf den 3 Achsen entsprechen

          Code:
          Select x,y,z, (x-".$startx.") as dx, (y-".$starty.") as dy, (z-".$startz.") as dz 
            WHERE (dx*dx+dy*dy+dz*dz)<=(".$gap*$gap.")
          wobei das ganz schön viel Rechnerei für ne Datenbank ist
          Zuletzt geändert von eagle275; 19.10.2010, 09:45. Grund: Berechnung teilweise in PHP
          [font=Verdana]
          Wer LESEN kann, ist klar im Vorteil!
          [/font]

          Kommentar


          • #6
            Hallo Danke zum zweiten. hab mir das zu herzen genommen und den unnötigen Würfel komplett entfernt und die Berechnung direkt mit SQL Statement gemacht (sollte Rechneleistung sparen). Das einzige verflixte Problem ist, dass ich immer noch das selbe Ergebnis erhalte und ich es mir einfach nciht erklären kann. Die Entfernung zwischen 2 Punkten misst man doch nunmal so..
            PHP-Code:
            function collision($db$x$y$z$gap){
                
            $collision false;
                
            $sql =    'SELECT x, y, z FROM stars WHERE
                                POW(x-'
            .$x.',2)+
                                POW(y-'
            .$y.',2)+
                                POW(z-'
            .$z.',2)
                                <= '
            .$gap*$gap;      
                
            $result $db->query($sql) or die (mysql_error());    
                
                while (
            $row $result->fetch_assoc()) {
                    
            $collision true;
                    break;
                }
                return 
            $collision;

            Ergebnis
            Code:
            Entfernung: 22.561028345357
            Es gab 1 Kollision bei4827-4583-1684
            
            Entfernung: 23.108440016583
            Es gab 1 Kollision bei4715-4938-745
            
            Entfernung: 22.561028345357
            Es gab 1 Kollision bei5923-5044-749
            
            Entfernung: 23.108440016583
            Es gab 1 Kollision bei4911-4989-1629
            
            Entfernung: 22.561028345357
            Es gab 1 Kollision bei5227-4761-696
            
            Entfernung: 22.561028345357
            Es gab 1 Kollision bei4567-5404-684
            
            Entfernung: 23.108440016583
            Es gab 1 Kollision bei5366-4358-796
            Interessant ist auch dass immer die gleichen Werte ausgelesen werden..
            Zuletzt geändert von Anutet; 19.10.2010, 09:29. Grund: Wurzel entfernt / Gap verdoppelt (Umgeformt)

            Kommentar


            • #7
              bau mal eine Klammer um die 3 Summanden, und zur Not probier es mal mit meiner Schreibweise

              das "FROM stars" wirst du da schon noch unterbringen vor dem Where
              Zuletzt geändert von eagle275; 19.10.2010, 09:39.
              [font=Verdana]
              Wer LESEN kann, ist klar im Vorteil!
              [/font]

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                bau mal eine Klammer um die 3 Summanden, und zur Not probier es mal mit meiner Schreibweise

                das "FROM stars" wirst du da schon noch unterbringen vor dem Where
                danke, aber das wars auch nicht. das ist ein gaannz böser wurm...

                Kommentar


                • #9
                  also ich hab das eben mal bei mir testweise gebaut .... es funktioniert mit deiner Abfrage , wobei ich von pow abstand nehmen würde .. nimm lieber die einfache Multiplikation

                  PHP-Code:
                  $sql="SELECT x,y,z,
                  (SQRT((x-"
                  .$startx.")*(x-".$startx.")+(y-".$starty.")*(y-".$starty.")+(z-".$startz.")*(z-".$startz.")))
                    as distance 
                  FROM test 
                  WHERE 
                  ((x-"
                  .$startx.")*(x-".$startx.")+(y-".$starty.")*(y-".$starty.")+(z-".$startz.")*(z-".$startz."))<=(".$gap*$gap.")
                   "

                  ich hab bei mir extra mit Punkten sehr dicht um die 20er-Grenze getestet - maximal kommt bei mir 20 als Distanz
                  heraus ... ansonsten immer nur kleinere Werte

                  meine Testdaten
                  Code:
                  ID  x  y  z
                  1  1000 1000 1000
                  2  1010 1010 1010
                  3  1020 1000 1000
                  4  1030 1000 1000
                  5  1011 1011 1011
                  6  1011 1011 1012
                  7  1011 1012 1012
                  8  1012 1012 1012
                  obige Anfrage mit 1000 / 1000 / 1000 liefert dann korrekt
                  Code:
                  x  y  z   distance
                  1000 1000 1000   0 [lol]
                  1010 1010 1010   17,32......
                  1020 1000 1000   20
                  1011 1011 1011   19,05......
                  1011 1011 1012   19,64......
                  Zuletzt geändert von eagle275; 19.10.2010, 10:17.
                  [font=Verdana]
                  Wer LESEN kann, ist klar im Vorteil!
                  [/font]

                  Kommentar


                  • #10
                    eagle275 ich danke dir tausendmal, du hast mir sehr weitergeholfen. Ich habe zwar immer noch das selbe Resultat aber durch deinen Test (den ich auch wiederholt habe) kann ich bestätigen dass es nicht an der SQL Abfrage liegt.
                    Das einzige was ich mir noch erklären kann ist dass die Sterne nicht so zufällig platziert werden wie sie es laut meinem Algorithmus sollten. Ich werde das nochmal überprüfen und in jedemfall noch ein kurzes Statement schreiben.
                    Herzlichsten Dank wie ihr Neulingen hier helft!!

                    Kommentar


                    • #11
                      Es funktionierrrtttt!!!!!!
                      PHP-Code:
                      if ($row['distance']!=0) {
                           
                      $collision true;    
                           break;

                      ist alles was irgendwie nötig war. Ich kanns mir nicht erklären, aber es scheint dass ich dadurch das ich den eigenen Planeten mit Entfernung 0 nicht ausgeschlossen habe, irgendwie mein ganzes system durcheinander gebracht hat..
                      Vielen Dank für die intensive Hilfe

                      Kommentar

                      Lädt...
                      X