Ein neues Thema erstellen  Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1 2 Nächste
Autor Nachricht
 Betreff des Beitrags: Wurzelfunktion in Small
BeitragVerfasst: 16.12.2002, 21:04 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
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!

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16.12.2002, 21:16 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
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.

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16.12.2002, 23:08 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Selbst wenn Small die Wurzelfunktion integriert hätte, was glaubst Du wohl wie die berechnet würde? ;)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 15:16 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 15:34 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
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.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 16:39 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
da bin ich gespannt ob was bei rauskommt


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 17:34 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
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...*

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 18:38 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 19:47 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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;
}


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 21:31 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
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! ;)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 22:00 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
wenn du die parametervektoren veränderst, werden sie dann nciht auch ausserhalb der funktion verändert?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 17.12.2002, 23:06 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 10:19 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
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.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 15:51 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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:


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 17:02 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Jetzt muss nur noch Sir Drink a lot sagen, ob das das ist, was er gesucht hat. ;)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 18:30 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
Ich nehme meine allererste gepostete Lösung :lol:

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

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 19:27 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Blasphemie, Ketzer, Du unwürdiges Etwas, arrogantes Ekel, selbstherrlicher Egomane, to be continued... :D

I bite your legs off.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 20:03 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 23:09 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
hihi :-)

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

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18.12.2002, 23:21 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
:cry: :cry: :cry:


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1 2 Nächste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"