AdminMod.de
https://www.adminmod.de/

Wurzelfunktion in Small
https://www.adminmod.de/viewtopic.php?t=4533
Seite 1 von 2

Autor:  Sir Drink a lot [ 16.12.2002, 21:04 ]
Betreff des Beitrags:  Wurzelfunktion in Small

Hi Jungs und Mädels!

Hat jemand eine Wurzelfunktion für Small gemacht.

Ich brauche die, um den Abstand zweier Spieler zueinander zu berechnen.

Danke euch!

Autor:  Sir Drink a lot [ 16.12.2002, 21:16 ]
Betreff des Beitrags: 

vergesst es...

Habs im englischen Forum gefunden.

Ich nehme lieber die Annäherung. So genau muss es nicht sein.

Aber ich lasse den Thread trotzdem mal offen.

Autor:  [WING] Black Knight [ 16.12.2002, 23:08 ]
Betreff des Beitrags: 

Selbst wenn Small die Wurzelfunktion integriert hätte, was glaubst Du wohl wie die berechnet würde? ;)

Autor:  Rinde [ 17.12.2002, 15:16 ]
Betreff des Beitrags: 

im englischen forum gabs mal dieselbe diskussion, wie du bereits sagtest. ich weiss nicht, ob du dich auf dasselbe beziehst woran ich denke, aber damals kam man zu keiner guten lösung zur berechnung des abstandes zweier spieler. btw amxmod hat die funktion distance(vec1[3],vec2[3]) o.ä. bereits fest eingebaut.

Autor:  [WING] Black Knight [ 17.12.2002, 15:34 ]
Betreff des Beitrags: 

Die setzt aber auf die gleiche Näherungsfunktion.
Jedenfalls habe ich vor kurzem eine Suche im Internet nach einer einfachen Näherungsformel gemacht. Dies hat fast ausschließlich die beschriebene Formel zu Tage gebracht.
Und für den Satz des Pythagoras im 3D-Raum gilt:

x²+y²+z²=d²

Man muss die Wurzelfunktion also nur einmal anwenden.
Ich kann mich ja mal heute abend dran versuchen.

Wäre ja wohl gelacht, wenn wir keine distance() Funktion hinbekämen.

Autor:  Rinde [ 17.12.2002, 16:39 ]
Betreff des Beitrags: 

da bin ich gespannt ob was bei rauskommt

Autor:  Sir Drink a lot [ 17.12.2002, 17:34 ]
Betreff des Beitrags: 

So. Damit sich Blacky völlig umsonst bemüht, poste ich mal die Formel :-)

Das rechnen mit integern reicht völlig aus für die Genauigkeit.

Hier die Funktion:
Code:
stock sqrt( num ) {
  new div = num;   
  new result = 1;

  while (div > result) {          // end when div == result, or just below
      div = (div + result) / 2;   // take mean value as new divisor   
      result = num / div;   
  } // while

  return div; 
}  
*oh..ich hatte ja Forums-Jubiläum...*

Autor:  Rinde [ 17.12.2002, 18:38 ]
Betreff des Beitrags: 

Zitat:
*oh..ich hatte ja Forums-Jubiläum...*
muh verdammt. ich hab sbei 1999 gemerkt, aber dann vergessen was zu sagen ^^

und zu der funktion: hast du die selber geschrieben? funktioniert die auch? darf ich die benutzen?

Autor:  Rinde [ 17.12.2002, 19:47 ]
Betreff des Beitrags: 

Code:
stock dist(vec1[3],vec2[3]) {
    new vec0[3] = {vec1[0] - vec2[0],vec1[1] - vec2[1],vec1[2] - vec2[2]};
    new i = vec0[0] * vec0[0] + vec0[1] * vec0[1] + vec0[2] * vec0[2]
    new j = i;
    new k = 1;
    while(j > k) {
        j = (j + k) / 2;
        k = i / j;
    }
    return j;
}

Autor:  [WING] Black Knight [ 17.12.2002, 21:31 ]
Betreff des Beitrags: 

Hab ich es nicht gesagt, dass es sich um die Heron-Formel handelt?

Ihr glaubt doch nicht im Ernst, dass die das Rad neu erfinden. Die Funktion von Rinde sieht fast perfekt aus. Das ist zumindest die Standard-Herangehensweise.
Eine Näherungsformel ist nicht nur von der Konvergenz sondern auch von der Güte des Anfangswertes abhängig. Dort 1 anzunehmen ist leider etwas ungeschickt. Nehmen wir mal an ich möchte aus 10000 die Wurzel ziehen. Dann ist 1 nicht gerade ein günstiger Anfangswert.
Ich würde daher vorschlagen als Anfangswert immer die längste Kante zu nehmen, wo wir sie doch von Haus aus berechnen.
Code:
stock dist(vec1[3],vec2[3]) {
  new k = -1;
  new i = 0;
  for(x=0;x<=2;x++){
    vec1[x] = vec1[x] - vec2[x];
    vec2[x] = vec1[x] * vec1[x];
    k = max(vec2[x],k);
    i +=vec2[x]; 
  }
  new j = i;
  while(j > k) {
    j = (j + k) / 2;
    k = i / j;
  }
  return j;
}
Wenn Ihr die Genauigkeit erhöhen wollt, dann müsst Ihr die Abstände mit einem Faktor z.B. 100 multplizieren. Das Ergebnis muss dann mit 2 Nachkommastellen interpretiert werden.
Ich habe den Code noch etwas strukturiert und die Variablenzahl reduziert. Grundsätzlich sollte es so gehen. Müsste mal jemand ausprobieren. ;)

PS.: Glückwunsch, Drinki! Mein Jubiläum hat aber auch keiner bemerkt. WING rult da Forum! ;)

Autor:  Rinde [ 17.12.2002, 22:00 ]
Betreff des Beitrags: 

wenn du die parametervektoren veränderst, werden sie dann nciht auch ausserhalb der funktion verändert?

Autor:  Rinde [ 17.12.2002, 23:06 ]
Betreff des Beitrags: 

Code:
stock dist(vec1[3],vec2[3],accuracy=1) { //Returns the approximate distance between two vectors. A greater accuracy returns a more exact value.
    new vec0[3];
    new i,j,k;
    new l = max(1,accuracy);
    for(i=0;i<3;i++){
        vec0[i] = l * abs(vec1[i] - vec2[i]);
        k = max(vec0[i],k);
        vec0[i] = vec0[i] * vec0[i];
        j +=vec0[i];
    }
    while(j > k) {
        j = (j + k) / 2;
        k = i / j;
    }
    return j / l;
}

stock abs(num) { //Returns the positive value of num.
    if(num > 0) {
        return num;
    }
    return -num;
}
so hab ichs jetzt
deins hat als startwert für die annäherung nicht die längste seite, sondern das größte quadrat genommen, ich weiss nciht ob das noch hingehauen hätte

Autor:  [WING] Black Knight [ 18.12.2002, 10:19 ]
Betreff des Beitrags: 

Das ist richtig, die einzelnen Vektoren werden verändert. Allerdings wüsste ich keinen Verwendungszweck nach dieser Abfrage. Ich finde es gar nicht mal schlecht. Mir schwebte das eher als Unterfunktion vor.
Stimmt, das mit dem Quadrat habe ich übersehen. Man sollte nicht totmüde noch an irgendwelchen Funktionen herumdoktern. An der abs() Funktion führt wohl kein Weg vorbei. Auf die wollt ich eigentlich verzichten. *seufz*

So hatte ich mir den endgültigen Code vorgestellt. Eingangsdaten sind halt nicht die Positionen, sondern die UserIndizes.
Code:
stock distance(UserIndexA,UserIndexV) {
 new Attacker[MAX_NAME_LENGTH];
 new Victim[MAX_NAME_LENGTH];
 new vec1[3],vec2[3];
 new k = -1;
 new i = 0;
 new j = 0;

 playerinfo(UserIndexA,Attacker,MAX_NAME_LENGTH);
 playerinfo(UserIndexB,Victim,MAX_NAME_LENGTH);

 get_userorigin(Attacker,vec1[0],vec1[1],vec1[2]);
 get_userorigin(Victim,vec2[0],vec2[1],vec2[2]);

 for(x=0;x<=2;x++){
  vec1[x] = vec1[x] - vec2[x];
  vec2[x] = vec1[x] * vec1[x];
  k = max(abs(vec1[x]),k);
  i +=vec2[x]; 
 }

 j = i;
 while(j > k) {
  j = (j + k) / 2;
  k = i / j;
 }
 return j;
}

stock abs(num) {
  if(num > 0) {
    return num;
  }
  return -num;
}
BTW, die Angabe der Genauigkeit würde ich weglassen, da bei Deiner jetzigen Implementierung sich nur die Rechenzeit erhöht, das Ergebnis aber exakt gleich ist. Durch j/l reduzierst Du die Genauigkeit leider wieder auf 1.

Autor:  Rinde [ 18.12.2002, 15:51 ]
Betreff des Beitrags: 

Zitat:
BTW, die Angabe der Genauigkeit würde ich weglassen, da bei Deiner jetzigen Implementierung sich nur die Rechenzeit erhöht, das Ergebnis aber exakt gleich ist. Durch j/l reduzierst Du die Genauigkeit leider wieder auf 1.
das ist mir nach dem posten auch aufgefallen. :oops:

Autor:  [WING] Black Knight [ 18.12.2002, 17:02 ]
Betreff des Beitrags: 

Jetzt muss nur noch Sir Drink a lot sagen, ob das das ist, was er gesucht hat. ;)

Autor:  Sir Drink a lot [ 18.12.2002, 18:30 ]
Betreff des Beitrags: 

Ich nehme meine allererste gepostete Lösung :lol:

Schließlich ist der Sever ja kein 286er, und muss den Anfangswert 1 abkönnen.

Autor:  [WING] Black Knight [ 18.12.2002, 19:27 ]
Betreff des Beitrags: 

Blasphemie, Ketzer, Du unwürdiges Etwas, arrogantes Ekel, selbstherrlicher Egomane, to be continued... :D

I bite your legs off.

Autor:  Rinde [ 18.12.2002, 20:03 ]
Betreff des Beitrags: 

Zitat:
Blasphemie, Ketzer, Du unwürdiges Etwas, arrogantes Ekel, selbstherrlicher Egomane, to be continued... :D

I bite your legs off.
dem ist nichts hinzuzufügen. ich bin zutiefst empört :x

Autor:  Sir Drink a lot [ 18.12.2002, 23:09 ]
Betreff des Beitrags: 

hihi :-)

Vorsicht!! Beleidigt nicht den Admin dieses Forums.... :lol:
DAS ist Blasphemie...innn deeen Staaaauuuuub....ihr pösen Purschen!!!

Autor:  Rinde [ 18.12.2002, 23:21 ]
Betreff des Beitrags: 

:cry: :cry: :cry:

Seite 1 von 2 Alle Zeiten sind UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/