Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-08-2003, 11:47   #1 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
etwas komplexeres Sortieren

Hallo,

ich bin grade an einem PathFinder (s. OOP-Board), und will die Laufrichtungen erstmal sortieren. Ich habe es wie folgt mit einer Funktion für array.sort(funktion); versucht:

ActionScript:
  1. pathFinder = new Object();
  2. pathFinder.directions = [];
  3. pathFinder.directions[1] = {x:0,y:-1};
  4. pathFinder.directions[2] = {x:1,y:0};
  5. pathFinder.directions[3] = {x:0,y:1};
  6. pathFinder.directions[4] = {x:-1,y:0};
  7. pathFinder.x1 = 100;
  8. pathFinder.x2 = 100;
  9. pathFinder.y1 = 100;
  10. pathFinder.y2 = 300;
  11.  
  12. a = [1,2,3,4];
  13.  
  14. sortDir = function(a,b){
  15.     trace(a+""+b);
  16.     var pf = pathFinder;
  17.     var pfd = pf.directions;
  18.     var x = pf.x2-pf.x1;
  19.     var y = pf.y2-pf.y1;
  20.     var xd = (x>0)?(1):((x<0)?(-1):(0));
  21.     var yd = (y>0)?(1):((y<0)?(-1):(0));
  22.    
  23.     var axd = Math.abs(xd - pfd[a].x);
  24.     var ayd = Math.abs(yd - pfd[a].y);
  25.     var bxd = Math.abs(xd - pfd[b].x);
  26.     var byd = Math.abs(yd - pfd[b].y);
  27.     var aw = axd*axd+ayd*ayd;
  28.     var bw = bxd*bxd+byd*byd;
  29.    
  30.     if(aw > bw)return 1;
  31.     else if(bw > aw)return -1;
  32.     else return 0;
  33. }
  34. t=getTimer();
  35. trace(a.sort(sortDir).join());
  36. trace(getTimer()-t);


//Ausgabe:

14
13
12
11
24
24
23
23
23
24
3,2,4,1
37

war mir sorgen macht, ist, dass das ganze 37ms braucht, wenn ich das oft machen muss, ist es viel zu langsam.

Habt ihr ne Ahnung wie ich das schneller machen kann?
Janoscharlipp ist offline   Mit Zitat antworten
Alt 10-08-2003, 15:15   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Das Math.abs kannst du schon mal rausnehmen, das wird durch das anschliessende Quadrieren sowieso positiv.

Was für Werte können denn pfd[a].x annehmen ?

mfg r
bokel ist offline   Mit Zitat antworten
Alt 10-08-2003, 15:48   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
stimmt, das quadrieren habe ich erst später eingeführt, um die Unterschiede zwischen "falsche x und falsche y Richtung (falsch = 0 statt 1 oder 1 statt 0)" und "ganz falsche x oder ganz falsche y Richtung (ganz falsch = -1 statt 1 oder 1 statt -1)" herzustellen.

pfd[a].x ist oben definiert, es kann -1,0,1 sein.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 10-08-2003, 16:16   #4 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
so, habe ich mal aufgeräumt. Der größte Fehler war, das ganze als eine Ergänzung zur sort-Funktion anzulegen, denn so wurde es sehr oft aufgerufen, tat aber immer einiges gleich. hier ne neue Version, braucht nur noch ca. 1/8 der Zeit für das gleiche Ergebnis:

ActionScript:
  1. sortDir = function(){
  2.     var pf = pathFinder;
  3.     var pfd = pf.directions;
  4.     var x = pf.x2-pf.x1;
  5.     var y = pf.y2-pf.y1;
  6.     var xdir = (x>0)?(1):/**/((x<0)?(-1):/**/(0));
  7.     var ydir = (y>0)?(1):/**/((y<0)?(-1):/**/(0));
  8.     var dir = [],ndir = [];
  9.     var xd,yd,w;
  10.    
  11.     for(var i=0; i<4; i++){
  12.         xd = xdir - pfd[i].x;
  13.         yd = ydir - pfd[i].y;
  14.         w = xd*xd+yd*yd;
  15.         dir.push({i:i,w:w});
  16.     }
  17.     dir.sortOn("w");
  18.     for(i in dir){
  19.         ndir[i] = dir[i].i;
  20.     }
  21.     return ndir;
  22. }
  23.  
  24. t=getTimer();
  25. bla = sortDir();
  26. trace(getTimer()-t);
  27. trace(bla);

Geändert von Janoscharlipp (10-08-2003 um 16:18 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

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 sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele