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, String

Der 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:

abctrue

Bedingte 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_CM

Bedingte Funktionen:

if, switch

Math-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, Interpolation

String-Funktionen (Murl::String):

GetLength, Trim, TrimLeft, TrimRight, Left, Right, Mid, ToLowerUTF8, ToUpperUTF8, GetLengthUTF8, Replace, Find, ReverseFind, FindFirstOf, FindFirstNotOf, StartsWith, EndsWith, Compare

Explizite Typkonvertierung:

SInt32, Double, Bool, String

Konvertierungs-Funktionen (Murl::Util):

StringToDouble, StringToSInt32, StringToBool, DoubleToString, SInt32ToString, BoolToString

Zufallszahlen (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:

' sollte ersetzt werden mit &apos;
" sollte ersetzt werden mit &quot;
& sollte ersetzt werden mit &amp;
< sollte ersetzt werden mit &lt;
> sollte ersetzt werden mit &gt;


Beim Newsletter anmelden
und keine News-Updates mehr verpassen.


Copyright © 2011-2017 Spraylight GmbH.