| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

18-10-2010, 21:10
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 6
|
|
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!
Geändert von Anutet (18-10-2010 um 21:15 Uhr)
Grund: sence mistake
|

18-10-2010, 22:17
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Anutet
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 ...?
Zitat:
|
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.
Ouch. Doesn't that hurt ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

18-10-2010, 23:41
|
|
mephisto111
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 41
|
|
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.
Geändert von mephisto111 (19-10-2010 um 00:09 Uhr)
|

19-10-2010, 01:31
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 6
|
|
Zitat:
Zitat von wahsaga
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.
Zitat:
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)
|

19-10-2010, 08:02
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
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
__________________
Wer LESEN kann, ist klar im Vorteil!
Geändert von eagle275 (19-10-2010 um 09:45 Uhr)
Grund: Berechnung teilweise in PHP
|

19-10-2010, 09:27
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 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..
Geändert von Anutet (19-10-2010 um 09:29 Uhr)
Grund: Wurzel entfernt / Gap verdoppelt (Umgeformt)
|

19-10-2010, 09:36
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
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
__________________
Wer LESEN kann, ist klar im Vorteil!
Geändert von eagle275 (19-10-2010 um 09:39 Uhr)
|

19-10-2010, 09:41
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 6
|
|
Zitat:
Zitat von eagle275
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...
|

19-10-2010, 09:47
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
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......
__________________
Wer LESEN kann, ist klar im Vorteil!
Geändert von eagle275 (19-10-2010 um 10:17 Uhr)
|

19-10-2010, 14:29
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 6
|
|
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!!
|

19-10-2010, 15:18
|
|
Anutet
Registrierter Benutzer
|
|
Registriert seit: Oct 2010
Beiträge: 6
|
|
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
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|