Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 16-09-2004, 09:49   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 32
Question elegante lösung gesucht: zahlenbereich für winkel eingrenzen: [0,360[

hallo leute....

ich glaub, ich steh grad ein bisschen aufm schlauch...

_currentRotation kennzeichnet einen winkel und soll immer zwischen 0 und 360 liegen (d.h. 361 entspricht 1). momentan verfahre ich nach einer änderung von _currentRotation folgendermaßen:

Code:
while(_currentRotation >= 360) _currentRotation -= 360;
while(_currentRotation < 0) _currentRotation += 360;
da muss es aber doch wohl einen eleganteren weg geben, oder?

danke + gruß,
pixologe
pixologe ist offline   Mit Zitat antworten
Alt 16-09-2004, 09:51   #2 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Hi,

ja, das geht mit dem guten alten Modulo:

_currentRotation += 360; // gegen negative Werte
_currentRotation %= 360;

Teilt ganzzahlig durch 360 und gibt den Rest zurück.

Grüße
Sascha
__________________
12:15, press return

Geändert von ludabruda (16-09-2004 um 09:52 Uhr)
ludabruda ist offline   Mit Zitat antworten
Alt 16-09-2004, 09:53   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 32
hatte ich auch schon...
funzt, solange _currentRotation >= 0
andernfalls fliegts auf die fresse... *ouch* ;-)
pixologe ist offline   Mit Zitat antworten
Alt 16-09-2004, 09:55   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 32
aaah alles klar... ;-)

aber wenn ich zb auch werte wie -370 in betracht ziehen will siehts schon wieder ähnlich unelegant aus....
pixologe ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:01   #5 (permalink)
.
 
Registriert seit: May 2003
Ort: bayern
Beiträge: 1.117
da hilft nur eins frag robert penner, wie in vielen fällen sehr zu empfehlen, guckst du hier:

Math.fixAngle(angle){
angle %= 360;
return (angle < 0)?angle + 360 : angle;
}
mooseMash ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:04   #6 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
ok, wenn du eine freie Eingabe hast, kann sowas rauskommen. Üblicherweise sind Veränderungen des Winkels aber kleiner 360 Grad. Da du die Korrektur jedes Mal ausführst, ist das eigentlich kein Problem.

so geht es immer:

k = (w%360 + 360)%360;

bei w = -370 ist w%360 = -10;
plus 360 macht 350. Der zweite Modulo macht nix.
bei w = 400 ist w%360 = 40; plus 360 macht wieder 400
400%360 = 40;

Ich kann nicht sagen, ob das die performanteste Art ist, aber sie ist kurz und tut's

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:06   #7 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
@mooseMash: das war auch meine erste Lösung. Fragt sich nur, was schneller ist:
eine if-Abfrage (bzw. ein ternärer Ausdruck) oder ein weitereR Modulo...

Grüße
Sascha
__________________
12:15, press return

Geändert von ludabruda (16-09-2004 um 10:13 Uhr)
ludabruda ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:11   #8 (permalink)
.
 
Registriert seit: May 2003
Ort: bayern
Beiträge: 1.117
hi ludabruda
gib die geschlagen unde lerne schreiben!!!
nix für ungut
mooseMash
mooseMash ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:14   #9 (permalink)
a.k.a maddin79
 
Benutzerbild von madflanderz
 
Registriert seit: Jul 2003
Ort: berlin f-hain
Beiträge: 1.693
PHP-Code:
function fixAngle(angle){
angle %= 360;
return (
angle 0)?angle 360 angle;
}


var 
time getTimer();
for (var 
0i100000i++) {
    
= (i%360 360)%360;
    }
    
trace("1. " + (getTimer() - time));


var 
time getTimer();
for (var 
0i100000i++) {
    
fixAngle(i)
    }
    
trace("2. " + (getTimer() - time));

var 
time getTimer();
for (var 
0i100000i++) {
    var 
angle 360;
    
angle = (angle 0)?angle 360 angle;
    }
    
trace("3. " + (getTimer() - time)); 
Ausgabe:

1. 575
2. 1835
3. 896


schaice , mein rechner fährt in 10 s runter ....
__________________
www.madflanderz.de

ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°` _ addicted to bass _ `°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø
madflanderz ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:30   #10 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
@mooseMash: na, das sieht aber interessant aus
Thanks to maddin79 für die prompte Beweisführung. Bei mir ergibt sich zwar nur etwa Faktor 2, aber das Ergebnis ist eindeutig.

Obgleich ich kein vehementer Anhänger dieses Mikro-Performance-Differenz-Kults bin; in realistischer Umgebung ist die Differenz wohl kaum messbar und vor allem kaum merklich

Btw: das gleiche Skript von mir als Funktionsaufruf zeigt nur eine sehr geringe Differenz zu Penners Funktion:

Penner: 1295
bruda: 1238
(bruda direkt in Schleife: 461)

Am schnellsten geht es in einer Funktion, wenn diese als Math.prototype definiert ist (706):

Math.prototype.fixAngle = function(angle){
return(angle%360 + 360)%360;
}

Grüße
Sascha
__________________
12:15, press return

Geändert von ludabruda (16-09-2004 um 10:32 Uhr)
ludabruda ist offline   Mit Zitat antworten
Alt 16-09-2004, 10:41   #11 (permalink)
Neuer User
 
Registriert seit: Jul 2004
Beiträge: 32
jessas...
ihr seid zu schnell für mich ;-)

coole sache auf jeden fall!
die teile sehen dann wohl doch beide _deutlich_ eleganter aus als meins ;-)

dank euch allen und cheers,
pixologe :)
pixologe 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 10:46 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele