Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-02-2004, 23:43   #1 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Winkeldifferenz | Winkel zwischen zwei Geraden

HI,

ich habe jetzt einige Zeit damit gekämpft, die Differenz von 2 Winkeln zu erhalten. Das Problem ist der Übergang bei 0 = 360 (bzw. 180 = -180) und überhaupt die periodizität mit 360.

das hier ist mein Ergebnis, falls mal jemand mit ähnlichen Problemen zu tun hat.

ActionScript:
  1. function winkeldifferenz(a,b)
  2. {
  3.     if(a<0)
  4.     {
  5.         a = (a % 360) + 360;
  6.     }
  7.     if(b<0)
  8.     {
  9.         a = (a % 360) + 360;
  10.     }
  11.     var d = Math.abs(a-b);
  12.     d = ((d + 180) % 360) - 180;
  13.     return Math.abs(d);
  14. }

vielleicht bin ich auch einfahc nur dumm, und das ist eigentlich ganz einfach, aber das % Zeug macht mich ganz wirr.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 28-02-2004, 08:59   #2 (permalink)
Flash & TYPO3
 
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 2.700
Wievso nicht einfach so?
ActionScript:
  1. function winkeldifferenz(a,b) {
  2.     d = a - b;
  3.    
  4.     if(d<0) {
  5.         d*= (-1);
  6.     }
  7.    
  8.     if(d>360) {
  9.         d = d % 360;
  10.     }
  11.    
  12.     trace(d);
  13. };
  14.  
  15.  
  16. winkeldifferenz(-120,570);

In den einigen Beispielen, in denen ich es getestet habe geht es
__________________
Mediendesign-Student
johanness ist offline   Mit Zitat antworten
Alt 28-02-2004, 09:05   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
die Differenz sollte immer die kleinste sein, also immer zwischen 0 und 180 liegen.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 28-02-2004, 09:15   #4 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
oder vielleicht so:

ActionScript:
  1. function winkeldifferenz(a,b)
  2. {
  3.     return Math.abs(((Math.abs(a - b) + 180) % 360) - 180);
  4. };
  5.  
  6.  
  7. trace(winkeldifferenz(-120,-10));

Das scheint auch immer das kleinste zurück zu geben.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 28-02-2004, 09:44   #5 (permalink)
Flash & TYPO3
 
Registriert seit: Oct 2003
Ort: Bayern
Beiträge: 2.700
Dann müsste es aber so auch gehen... Wusste ich ja zuvor nicht

ActionScript:
  1. function winkeldifferenz(a,b) {
  2.         d = a - b;
  3.        
  4.         if(d<0) {
  5.                 d*= (-1);
  6.         }
  7.        
  8.         if(d>360) {
  9.                 d = d % 360;
  10.         }
  11.         if(d>180) {
  12.                         d -= 180;
  13.         }
  14.        
  15.         trace(d);
  16. };
  17. winkeldifferenz(-120,570);
__________________
Mediendesign-Student
johanness ist offline   Mit Zitat antworten
Alt 28-02-2004, 10:01   #6 (permalink)
Level up
 
Benutzerbild von Alois
 
Registriert seit: Jun 2001
Ort: Bocholt
Beiträge: 4.155
hmmm...,
...nur positive Werte,
für die Anwendung ja nicht gerade praktisch (Beispiel: Figur dreht sich immer im kürzesten Winkel)
...hast Du da auch einen Lösungsansatz zu
...ich hatte dasselbe Problem mal folgendermassen gelöst (grad nochmal in eine funktion packen):
ActionScript:
  1. winkeldiff=function(a,b){
  2. var diff = b-a;
  3.         if (diff>180) {
  4.             diff = -(360-diff);
  5.         } else if (diff<-180) {
  6.             diff = 360+diff;
  7.         }
  8. return diff;
  9. }
...das funktioniert, Dein Ansatz ist aber schön tricky (auf modulo wär ich nie gekommen), wenn das mit positiv/negativ jetzt auch noch ohne if-Abfrage lösbar wäre wirds auch wohl fixer als mein doppel-if

Alois
__________________
-Spuckt mir auf den Stuhl, ich will im Grünen sitzen-
Alois ist offline   Mit Zitat antworten
Alt 28-02-2004, 10:09   #7 (permalink)
Level up
 
Benutzerbild von Alois
 
Registriert seit: Jun 2001
Ort: Bocholt
Beiträge: 4.155
...ok, wenn hier schon mehere basteln, dann stell ich mal eine fla zum Basteln zur Verfügung, eingefügt ist meine funktion, mit der alles so funktioniert wie ich mir das vorstelle...
Angehängte Dateien
Dateityp: zip nicht180grad.zip (2,5 KB, 19x aufgerufen)
__________________
-Spuckt mir auf den Stuhl, ich will im Grünen sitzen-
Alois ist offline   Mit Zitat antworten
Alt 28-02-2004, 10:39   #8 (permalink)
hmmmmm...
 
Benutzerbild von kenichi
 
Registriert seit: Feb 2004
Ort: deutschland
Beiträge: 112
@Janoscharlipp
deine letzte version ist doch eigentlich schon perfekt....

meine idee waere jetzt das hier gewesen:
ActionScript:
  1. function WinkelDifferenz(a,b)
  2. {
  3.     var diff = Math.abs(a-b) % 360;
  4.     if(diff > 180) return 360 - diff;
  5.     return diff;
  6. }
aer da ist immernoch eine if abfrage drin, von daher denke ich etwas langsamer als deine letzte version...

gruesse,
kenichi
kenichi ist offline   Mit Zitat antworten
Alt 28-02-2004, 11:11   #9 (permalink)
Level up
 
Benutzerbild von Alois
 
Registriert seit: Jun 2001
Ort: Bocholt
Beiträge: 4.155
...funzt net...
nochmal zur Erklärung, Janoscharlipp's funktion gibt schon richtige Werte zurück...allerdings nur positive, dann weiss flash zwar, daß mc xy sich z.B. um 120 Grad drehen müsste um einen gewissen Zielwinkel zu erreichen, aber immer noch nicht ob es nach links oder rechts gehen soll...einfach mal die meine fla runterladen und testen und dann die funktion durch andere hier gepostete austauschen....
__________________
-Spuckt mir auf den Stuhl, ich will im Grünen sitzen-
Alois ist offline   Mit Zitat antworten
Alt 28-02-2004, 18:41   #10 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Hi,

wow, schon mal vielen Dank.
Ifs sind sehr schnell, und Math.abs wird wohl auch nichts anderes machen, als intern mit einem if zu arbeiten... (in der Zwischenzeit glaube ich nicht, dass Flash noch irgendwas nicht simuliert...)

Erstmal ging es mir schon darum, nur positive Werte zu erhalten. Was da das beste ist werde ich nachher mal durchtesten.

Aber, du hast Recht Alois, ich habe zusätzlich auch noch das Problem mit dem Drehen, und dazu werde ich mir dann auch mal deine fla ansehen, vielen Dank.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 28-02-2004, 23:00   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
hmm, ich habe mir mal dein fla angesehen, Alois.
Ich komme auch zu keiner Besseren Lösung als du, nur habe ich das ganze noch auf Winkel jenseits von 360 Grad gemacht. (das ist für mich wichtig, da Teilweise Winkel hochlaufen)

ActionScript:
  1. winkeldiff2 = function(a,b)
  2. {
  3.     var diff = b-a;
  4.     if(diff > 180)
  5.     {
  6.         return ((diff + 180) % 360 ) - 180;
  7.     }
  8.     else if(diff < -180)
  9.     {
  10.         return ((diff - 180) % 360 ) + 180;
  11.     }
  12.     else
  13.     {
  14.         return diff % 360;
  15.     }
  16. };

und wie gesagt, IFs sind schnell!!
In den meisten Fällen ist es besser ein paar ifs zu nehmen, statt monster Rechnungen und Ähnliches zu machen.
Math.abs() scheint wirklich ein bissel optimiert zu sein, auf 10.000 durchläufe ist bei mir ein mit if nachgebautes abs 50ms langsamer (auf ~1.7s)
Beschläunigen lässt sich das nur durch abs = Math.abs; Wie immer eben, Pfade sind die große Schwäche von Flash.
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 13:39 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele