php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 18-10-2010, 21:10
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Lightbulb 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
Mit Zitat antworten
  #2 (permalink)  
Alt 18-10-2010, 22:17
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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 ...?

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.

Zitat:
my analized star.
Ouch. Doesn't that hurt ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 18-10-2010, 23:41
mephisto111
 Registrierter Benutzer
Links : Onlinestatus : mephisto111 ist offline
Registriert seit: Nov 2003
Beiträge: 52
mephisto111 befindet sich auf einem aufstrebenden Ast
Standard 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)
Mit Zitat antworten
  #4 (permalink)  
Alt 19-10-2010, 01:31
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
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)
Mit Zitat antworten
  #5 (permalink)  
Alt 19-10-2010, 08:02
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 19-10-2010, 09:27
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Standard

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)
Mit Zitat antworten
  #7 (permalink)  
Alt 19-10-2010, 09:36
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

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)
Mit Zitat antworten
  #8 (permalink)  
Alt 19-10-2010, 09:41
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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...
Mit Zitat antworten
  #9 (permalink)  
Alt 19-10-2010, 09:47
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

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)
Mit Zitat antworten
  #10 (permalink)  
Alt 19-10-2010, 14:29
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Standard

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!!
Mit Zitat antworten
  #11 (permalink)  
Alt 19-10-2010, 15:18
Anutet
 Registrierter Benutzer
Links : Onlinestatus : Anutet ist offline
Registriert seit: Oct 2010
Beiträge: 6
Anutet befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
range, speric


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
IP Range Classics Apps und PHP Script Gesuche 17 24-02-2007 14:00
IP Range mit modrewrite auf Datei weiterleiten MacFan Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 3 13-11-2006 09:02
Sperren einer IP Range Blodsfana Archiv / Trash 1 23-02-2006 12:07
[PostgreSQL] Funktion wie range für Arrays in PHP Patrick_PQ SQL / Datenbanken 3 31-03-2005 08:38
Aroree was wrong about www.BitriXTeam.com BitriXTeam Off-Topic Diskussionen 33 16-10-2003 18:29

Themen-Optionen
Thema bewerten
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.

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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:37 Uhr.