Mathematischer Evaluator
Gepostet am 14. Jänner 2015
Unser neuestes Murl Engine Feature ist ein praktischer Evaluator für mathematische Ausdrücke. Der Evaluator ermöglicht es, mathematische Ausdrücke als Parameter in Ressource XML Dateien zu verwenden. (Update am 24.02.2015)
Die Möglichkeit, mathematische Ausdrücke anstelle von festen Werten anzugeben, ist oft sehr nützlich.
Graphen-Objekte können so direkt konfiguriert werden, ohne dass zusätzlicher C++ Code notwendig ist.
Das ist vor allem dann praktisch, wenn mit Replikationen von Instanzen gearbeitet wird.
Das Feature-Bild zeigt ein Beispiel, bei dem ein mathematischer Ausdruck dazu verwendet wurde, um mehrere PlaneGeometry
-Objekte entlang einer herzförmigen Kurve auszurichten.
Ein mathematischer Ausdruck wird definiert, indem der Ausdruck in geschwungene Klammern gesetzt wird. Das ist dieselbe Notation wie für übergebene Attribute. Hier ein einfaches Beispiel:
<PlaneGeometry id="plane_{replication}" posX="{replication*10}" posY="0"/>
Ausdrücke kombinieren
Eine Folge von Ausdrücken kann durch eine mit Strichpunkt getrennte Liste definiert werden. Der letzte Ausdruck wird dem Attribut zugewiesen.
<PlaneGeometry posX="{R=400;r=100;b=65;t=replication*0.01;(R-r)*Sin(t)-b*Sin((R-r)/r*t)}" />
Einzelne Ausdrücke können auch ineinander verschachtelt werden, was zu einer separaten Auswertung für jeden verschachtelten Ausdruck führt.
<PlaneGeometry posX="{{2*3}+6}}" />
Datentypen
Der Evaluator unterstützt die folgenden Datentypen:
Double, SInt32, Bool, StringDer richtige Datentyp wird automatisch bestimmt. Eine explizite Typkonvertierung kann in funktionaler Notation angegeben werden.
<PlaneGeometry posX="{SInt32(replication*0.1)}" />
Für die Angabe eines Strings
muss die Zeichenkette in einfache Hochkommas gesetzt werden:
<Node id="{'ab'+String('c')+BoolToString(1)}" />
Das Ergebnis des obigen Ausdrucks wäre:
abctrueBedingte Ausdrücke
Die if
Funktion kann verwendet werden, um bedingte if/else Ausdrücke zu erstellen.
<PlaneGeometry posX="{if(replication > 10, 100, 0)}" />
Ein äquivalenter C++ Code für diesen Ausdruck wäre:
if (replication > 10) { posX = 100; } else { posX = 0; }
Alternativ kann auch die switch
Funktion für bedingte Ausdrücke verwendet werden.
Die switch
Funktion erwartet einen Bedingungsparameter gefolgt von einer Reihe von Fallparametern.
Der Bedingungsparameter wird auf den Bereich [0, Anzahl_der_Fallparamter-1] beschränkt.
Beispiel:
<PlaneGeometry posX="{switch(replication * 0.1, 100, 200, 50)}" />
Bei diesem Bespiel wird der Bedingungsparameter auf den Bereich [0,2] beschränkt. Daher ergibt sich der Wert 100 für die Instanzen 0 bis 9, 200 für die Instanzen 10 bis 19 und 50 für alle anderen Instanzen.
Ein äquivalenter C++ Code für diesen Ausdruck wäre:
SInt32 condition = SInt32(replication * 0.1) if (condition < 0) { condition = 0; } switch(condition) { case 0: posX = 100; break; case 1: posX = 200; break; default: posX = 50; }
Zufallszahlen
Ein globaler Zufallszahlengenerator (RNG) steht für die Verwendung von Zufallszahlen zur Verfügung.
Der RNG wird beim Start immer mit dem gleichen Seedwert initialisiert, weshalb er immer die gleiche Reihe an Zufallszahlen liefert. Durch den Aufruf von Seed(value)
kann ein neuer Seedwert gesetzt werden.
Ein Aufruf von Seed()
ohne Parameter verwendet die aktuelle Systemzeit als Seedwert.
<Instance graphResourceId="graph_plane" replications="{Seed(42);10}"/>
Mit z.B. RandSInt(start, end)
kann eine neue Zufallszahl gezogen werden.
<PlaneGeometry posX="{replication*10}" posY="{RandSInt(-100,100)}" />
C++ Default-Parameter
Ein globaler Default-Parameter kann in der IApp::Configure()
Methode
definiert und dann in den mathematischen Ausdrücken ausgewertet werden.
Dafür wurde der IEngineConfiguration
Klasse die Methode GetDefaultGraphParameters()
hinzugefügt.
Bool App::MyApp::Configure(IEngineConfiguration* engineConfig, IFileInterface* fileInterface) { IAttributes* defaultParameters = engineConfig->GetDefaultGraphParameters(); defaultParameters->AddAttribute("myPosParam","42"); … }
Der neue Default-Parameter kann wie jede andere Variable gelesen werden:
<PlaneGeometry posX="{myPosParam}" />
Verfügbare Operatoren, Funktionen und Konstanten
Die folgende Liste beinhaltet alle verfügbaren Operatoren, Funktionen und Konstanten.
Die Verwendung ist gleich wie in C++.
Für String
-Funktionen muss der erste Parameter der String
sein, auf den die Methode angewendet werden soll.
Operatoren:
+, -, *, /, % (Addition, subtraction, multiplication, division, modulo) <<, >> (Shift operators) &, |, ^, ~ (Bitwise AND, OR, XOR, NOT) &&, ||, ^^, ! (Logical AND, OR, XOR, NOT) = (Assignment) ==, !=, <, <=, >, >= (Relational operators) # (Comment operator)
Konstanten:
E, PI, TWO_PI, HALF_PI, INV_PI, INV_TWO_PI, INV_HALF_PI, DEG_TO_RAD, RAD_TO_DEG, MM_TO_CM, CM_TO_MM, MM_TO_INCHES, CM_TO_INCHES, INCHES_TO_MM, INCHES_TO_CMBedingte Funktionen:
if, switchMath-Funktionen (Murl::Math):
Abs, Sgn, Min, Max, Clamp, IsNaN, IsInfinite, IsFinite, Exp, Log, Log2, Log10, Sqrt, Pow, Fmod, Sin, Cos, Tan, ArcSin, ArcCos, ArcTan, ArcTan2, SinHyp, CosHyp, TanHyp, ArcSinHyp, ArcCosHyp, ArcTanHyp, Floor, Ceil, Round, IsEqual, DegToRad, RadToDeg, MapAngle, AddAngle, SubAngle, Lerp, InterpolationString-Funktionen (Murl::String):
GetLength, Trim, TrimLeft, TrimRight, Left, Right, Mid, ToLowerUTF8, ToUpperUTF8, GetLengthUTF8, Replace, Find, ReverseFind, FindFirstOf, FindFirstNotOf, StartsWith, EndsWith, CompareExplizite Typkonvertierung:
SInt32, Double, Bool, StringKonvertierungs-Funktionen (Murl::Util):
StringToDouble, StringToSInt32, StringToBool, DoubleToString, SInt32ToString, BoolToStringZufallszahlen (Murl::Util::Rng):
Seed, Rand, RandBool, RandSInt, RandReal, RandDouble
Hinweis:
Bitte beachte, dass die folgenden Zeichen in XML-Dateien als XML-Entities definiert werden sollten:
Beim Newsletter anmelden
und keine News-Updates mehr verpassen.