Die Klasse Math

Die Klasse Math umfasst Methoden und Konstanten, die allgemeine mathematische Funktionen und Werte repräsentieren.

Alle Eigenschaften und Methoden der Math-Klasse sind statisch und müssen mit der Syntax Math.method(parameter) oder Math.constant aufgerufen werden.

Hexadezimalzahlen

Für die Eingabe von Zahlenwerten werden in Computerprogrammen häufig Hexadezimalzahlen verwendet.
Um die Hexadezimaldarstellung zu verstehen ist es sinnvoll, noch einmal die Dezimalschreibweise zu betrachten.
 

Dezimalsystem

Im Dezimalsystem gibt es 10 Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 und 0. Aus diesen Ziffern werden die Dezimalzahlen gebildet.
Z.B. steht die Dezimalzahl 214 für 2*100+1*10+4 oder in der Potenzschreibweise 2*102+1*101+4*100. 10 ist die Basis des Dezimalsystems und jede Ziffer hat je nach der Position in der Zahl ihren Stellenwert.
 

Analog ist das im Hexadezimalsystem

Hier ist der Zahlenwert 16 die Basis und im Hexadezimalsystem gibt es daher 16 Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 und zusätzlich 6 weitere Ziffern A, B, C, D, E, F.
Die Ziffer A hat dabei den Zahlenwert 10, B den Wert 11, C den Wert 12, D den Wert 13, E den Wert 14 und F den Wert 15.

Z.B. steht die Hexadezimalzahl D6 für D*16+6 oder in der Potenzschreibweise D*161+6*160. Daraus ergibt sich ein Zahlenwert 13*16+ 6 = 214
 

Darstellung von RGB-Farben als Hexadezimalzahlen

In Actionscript und in vielen anderen Programmiersprachen werden die RGB-Farbwerte durch Hexadezimalzahlen dargestellt.
Bekanntlich gibt es bei 8-bit Farbtiefe für jeden Farbkanal 256 möglicheWerte zwischen 0 und 255.

Der Dezimalzahl 255 entspricht im Hexadezimalsystem die Zahl FF (F*16+F = 15*16+15 = 255).

Somit hat die RGB-Farbe Weiß (255,255,255)  den Hexadezimalwert (FF, FF, FF).

In ActionScript beginnt eine Hexadezimalzahl immer mit 0x gefolgt von der eigentlichen Hexzahl.

Weiß ist daher 0xFFFFFF

Schwarz 0x000000 oder kurz 0x0

Rot 0xFF0000

Gelb 0xFFFF00

ein mittleres Grau 0x7F7F7F entspricht (127,127,127).

Zufallszahlen, die Funktionen Math.random() und Math.floor()

Die Funktion Math.random() liefert eine Pseudozufallszahl zwischen 0 und 1, wobei 1 ausgeschlossen ist.
D.h. jeder Aufruf der Funktion Math.random() liefert eine andere, zufällige Kommazahl n, wobei  0 <= n < 1 gilt. Man sagt auch, die Zahl liegt im halboffenen Intervall [0,1[

Wie die zurückgegebene Zahl berechnet wird, wird nicht bekannt gegeben. Man spricht von einer "Pseudo"-Zufallszahl, da es unvermeidlich ist, dass die Berechnung einige nicht-zufällige Elemente enthält, die aber den Anwendern nicht bekannt sind. Statistisch von "außen" betrachtet verhält sich eine Folge von Kommazahlen, die die Funktion Math.random() liefert, wie eine "echte, gewürfelte" Zufallszahlenfolge.
 

Ganzzahlige  Zufallszahlen zwischen 0 und einer ganzen Zahl a:

Gesucht ist ein Skript, das eine zufällige ganze Zahl im Intervall [0,a] (a eingeschlossen) liefert.

Math.random() liefert eine zufällige Kommazahl im Intervall [0,1[. Daher ist das Intervall [0,1[ immer Ausgangspunkt für die nachfolgenden Überlegungen.

Math.random() * (a+1) liefert eine zufällige Kommazahl im Intervall [0,a+1[
 

Wir verwenden nun die Funktion Math.floor():
Sei n eine beliebige Kommazahl. Dann liefert die Funktion Math.floor(n) die zu n nächstliegende Ganzzahl, die kleiner oder gleich der angegebenen Zahl n ist.
Beispiel: Math.floor(4.83) liefert 4, Math.floor(27) liefert 27.
 

Math.floor( Math.random() * (a+1) ) liefert somit das gewünschte Ergebnis, nämlich eine ganze Zahl im Intervall [0,a].


 
Ganzzahlige Zufallszahlen zwischen einer minimalen ganzen Zahl a und einer maximalen ganzen Zahl b:

Gesucht ist ein Skript, das eine zufällige ganze Zahl im Intervall [a,b] (a und b eingeschlossen) liefert.

Vorüberlegung: Man möchte z.B. eine ganze Zufallszahl zwischen 5 und 18. Wieviele Möglichkeiten gibt es?
Die Zufallszahl kann den Wert 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 und 18 haben. Das sind 14 oder 18 - 5 + 1 Möglichkeiten.
Allgemeine kann man sagen, in einem ganzzahligen Intervall [a,b] gibt es b-a+1 Möglichkeiten.

Nach dem obigen Skript und der Vorüberlegung liefert

Math.floor( Math.random() * (b-a + 1) ) eine ganzahlige Zufallzahl im Intervall [0, b-a].

 
Addiert man jetzt noch den Wert a dazu, erhält man das gewünschte Ergebnis:

a + Math.floor( Math.random() * (b-a + 1) )  liefert eine ganze Zahl im Intervall [a,b].

 

Dafür könnte man eine Funktion zufallszahl mit den Eingaben a und b für die untere und obere Grenze definieren, die man immer verwenden kann:

// Funktionsdeklaration
function zufallszahl(a:int,b:int):int {
return (a + Math.floor(Math.random() * (b - a + 1)));
}
// Beispiel für Funktionsaufruf
zufallszahl(5,18);
 

 
Komma-Zufallszahlen zwischen einer minimalen (Komma-)Zahl a und einer maximalen (Komma-)Zahl b:

Gesucht ist ein Skript, das eine zufällige Kommazahl im Intervall [a,b[ (a eingeschlossen und b ausgeschlossen) liefert.

Vorüberlegung: Wenn a und b Kommazahlen sind, wie lange ist das Intervall [a,b[ ? Das Intervall [a,b[ hat immer die Länge b-a.

Analog zu den obigen Überlegungen ohne die Funktion Math.floor() ergibt sich folgendes Skript:

a + Math.random() * (b-a)  liefert eine zufällige Kommazahl im Intervall [a,b[. Wichtig: Der Wert b ist nicht möglich.

 

Dafür könnte man wieder eine Funktion kommaZufallszahl mit den Eingaben a und b für die untere und obere Grenze definieren, die man immer verwenden kann:

// Funktionsdeklaration
function kommaZufallszahl(a:Number,b:Number):Number {
return (a + Math.random() * (b - a));
}
// Beispiel für Funktionsaufruf
kommaZufallszahl(-0.5,0.5);

 

 

Beispiel für die Verwendung von Zufallszahlen

Für das nachfolgende Skript ist in der Bibliothek ein Movieclipsymbol abgespeichert, das eine Kreisfläche enthält. Der Registrierungspunkt liegt im Kreismittelpunkt. Die Eigenschaft "Export für ActionScript" ist aktiviert und die Klasse hat den Namen Kreis.

Bei der Ausführung des Skripts werden 100 Kreis zufällig auf der Bühne verteilt, wobei die Deckkraft der Kreise einen zufälligen Wert zwischen 25% und 50% (d.h. zwischen 0.25 und 0.5) annehmen kann und die Skalierung der Kreise einen zufälligen Wert zwischen 50% und 200% (d.h. zwischen 0.5 und 2).

Ergebnis:

Skript ohne Funktionen:

var kreis_mc:MovieClip;
for (var i=0;i<100;i++) {
kreis_mc = new Kreis();
kreis_mc.x = Math.floor(stage.stageWidth * Math.random());
kreis_mc.y = Math.floor(stage.stageHeight * Math.random());
kreis_mc.alpha = 0.25 + (0.5 - 0.25) * Math.random();
kreis_mc.scaleX = kreis_mc.scaleY = 0.5 + (2 - 0.5) * Math.random();
this.addChild(kreis_mc);
}

 

Skript mit Funktionen:

function zufallszahl(a:int,b:int):int {
return (a + Math.floor((b - a + 1) * Math.random()));
}
function kommaZufallszahl(a:Number,b:Number):Number {
return (a + (b - a) * Math.random());
}
var kreis_mc:MovieClip;
for (var i=0;i<100;i++) {
kreis_mc = new Kreis();
kreis_mc.x = zufallszahl (0, stage.stageWidth-1);
kreis_mc.y = zufallszahl (0, stage.stageHeight-1);
kreis_mc.alpha = kommaZufallszahl (0.25,0.5);
kreis_mc.scaleX = kreis_mc.scaleY = kommaZufallszahl (0.5,2);
this.addChild(kreis_mc);
}

Koordinatentransformation

In der Computergrafik ist es immer wieder notwendig, ein Koordinatensystem zu drehen, um einfachere Berechnungen durchführen zu können. Es ist dabei notwendig, die Koordinaten eines Punktes vom ursprünglichen in das neue, gedrehte Koordinatensystem umzurechnen. Nachfolgend wird diese Umrechnung erklärt.

Gegeben: Ein Punkt P in einem Koordinatensystem mit den Koordinaten (x,y)

 

Gesucht: Die Koordinaten (x1,y1) des Punktes P bezüglich des um den Winkel alpha gedrehten Koordinatensystems.

 

Berechnung:

Den Winkel alpha kann man in der obigen Zeichnung noch an zwei anderen Stellen einzeichnen.

 

Man kann nun zwei rechtwinkelige Dreiecke einzeichnen mit den Strecken x bzw. y als Hypothenuse und dem Winkel alpha als einem der beiden anderen Winkel.

 

Mit den Winkelfunktionen Sinus und Cosinus kann man nun die Länge der Katheten diese beiden Dreiecke in Abhängigkeit vom Winkel alpha und den Größen x und y berechnen.

 

Somit gilt für die neuen Koordinaten x1 und y1:

x1 = x * cos alpha - y * sin alpha

y1 = x * sin alpha + y * cos alpha