Logischer Ausdruck

aus LokSim-Wiki, der freien Wissensdatenbank

Bei Streckenobjekten, Gruppenobjekten und Streckensounds können logische Ausdrücke definiert werden, welche bestimmen ob das Objekt angezeigt wird oder nicht (bzw der Sound abgespielt wird oder nicht).

In logischen Ausdrücken können Variablen (Operanden) mittels Operatoren verknüpft werden: Wird dieser Ausdruck zu einem Wert gleich 0 ausgewertet, so wird der gesamte Ausdruck als falsch gewertet. Ist der berechnete Wert ungleich 0, so ist der gesamte Ausdruck wahr.

Image:Tipp.png Diese Tatsache (und auch die möglichen Operatoren und Priorität) entspricht der C/++ Programmiersprache.

Inhaltsverzeichnis

Operanden (Variablen)

Konstante

Es können konstante, ganzzahlige Zahlen als Operatoren verwendet werden. Zusätzlich gibt es die Möglichkeit Zeitpunkte als hh:mm::ss oder hh::mm zu definieren (Stunden:Minuten:Sekunden). Diese Schreibweise wird bei der Auswertung in Sekunden nach 00:00 Uhr umgerechnet.

Variablen

Zusätzlich kann auf diverse Daten per Namen zugegriffen werden. Diese Daten werden immer mittels Namensraum::Variablenname angesprochen.

Derzeit sind folgende Namensräume bzw Variablen definiert:

  • WetterVars: Ermöglicht den Zugriff auf vom Benutzer definierte Variablen in Wetterdateien
  • WetterDaten: Ermöglicht den Zugriff auf vom Programm berechnete Daten zum Wetter
    • HelligkeitProzent: Helligkeit im Bereich 0-100
  • Simulation: Diverse sonstige Daten zur Simulation
    • ZeitInSekunden: Tageszeit in Sekunden seit 00:00 Uhr
  • Sonstige: Sammelkategorie für den Rest
    • Zufall: Liefert einen zufälligen Wert im Bereich [0;Sehr große Ganzahl[

Wird auf eine Variable zugegriffen, die nicht definiert ist, so wird 0 (falsch) zurückgeliefert.

Testen im LoksimEdit

Zu Testzwecken können im LoksimEdit unter Ansicht - Erweiterte 3D-Ansichtsoptionen sämtliche (auch von der Simulation vorgegeben, wie ZeitInSekunden) Variablen mit benutzerdefinierten Werten belegt werden. Damit kann man Testen, wie die Anzeige mit dieser Variablenbelegung aussieht

Operatoren

Operatoren verknüpfen die Operanden miteinander um das Endergebnis zu berechnen. Auflistung der verfügbaren Operatoren nach absteigender Priorität angeordnet (gleiche Hintergrundfarbe bedeutet gleiche Priorität):

Operator Bedeutung Alternative Syntax
 ! logisches Nicht, Negation: Wandelt einen Wert ungleich 0 in 0 um bzw umgekehrt not
* Multiplikation
/ ganzzahlige Division
% Modulo (Rest der Division)
+ Addition
- Subtraktion
< logischer Vergleich: kleiner
<= logischer Vergleich kleiner oder gleich
> logischer Vergleich größer
>= logischer Vergleich größer oder gleich
== logischer Vergleich auf Gleichheit
 != logischer Vergleich ungleich <>
&& logische Verknüpfung und; liefert wahr, falls beide Operanden wahr sind and
|| logische Verknüpfung oder; liefert wahr, falls einer der Operanden wahr ist or


Beispiele

Um das ganze etwas klarer zu machen, ein paar Anwendungsfall:

Ein Objekt soll nur zwischen 22:00 und 05:00 Uhr angezeigt werden, oder wenn die Helligkeit kleiner als 20 % ist:

Simulation::ZeitInSekunden >= 22:00 || Simulation::ZeitInSekunden <= 05:00 || WetterDaten::HelligkeitProzent < 20

Ein Sound soll nur zur vollen Stunde abgepielt werden, aber nicht nach 20:00 bzw vor 06:00 Uhr

Simulation::ZeitInSekunden % (60 * 60) <= 2 && !(Simulation::ZeitInSekunden > 20:00 || Simulation::ZeitInSekunden < 06:00)

Eine optimierte, gleichwertige Version wäre:

Simulation::ZeitInSekunden % 3600 <= 2 && Simulation::ZeitInSekunden <= 20:00 && Simulation::ZeitInSekunden >= 06:00

Erklärung: Zu jeder vollen Stunde ist die ZeitInSekunden durch 3600 ohne Rest teilbar. Dies bedeutet ZeitInSekunden % 3600 ergibt 0. Wenn man nun dies exakt mit 0 vergleicht, würde der Sound nur abgespielt, falls es exakt die volle Stunde ist. Für uns ist jedoch ein kleiner Spielraum von 2 Sekunden ok, also wird mit <= 2 geprüft, sodass der Sound auch 1 oder 2 Sekunden nach der vollen Stunde gestartet werden kann

Ein Objekt soll mit 60%iger Wahrscheinlichkeit angezeigt werden

Sonstige::Zufall % 100 < 60

Erklärung: Zufall liefert eine zufällige Zahl im Bereich 0 bis sehr große Zahl. Rechnet man diese Zahl modulo 100 (Rest der Division der Zahl durch 100) bekommt man eine zufällige Zahl im Bereich [0;100[ In 60% der Fälle ist diese Zahl kleiner als 60, und in den anderen 40 Prozent größer gleich 60. Also hat man genau die 60%ige Wahrscheinlichkeit


Mit der Steuerung ist auch eine funktionsfähige Uhr umsetzbar, wie das Beispiel von Peter Siegert zeigt

Einfluss auf Performance

Bei großflächigem Einsatz von logischen Ausdrücken, sollte man etwaige Auswirkungen auf die Performance bedenken:

  • Objekte bei denen Objekt in Sichtweite ändert Sichtbarkeit nicht gesetzt ist, haben kaum Einfluss auf die Performance: Solche Ausdrücken müssen während der Simulation nur ein einziges Mal berechnet werden und sind anschließend fixiert
  • Auch konstante Ausdrücke (kein Zugriff auf Variablen außer Sonstige::Zufall) müssen nur ein einziges Mal berechnet werden
  • Sonstige logische Ausdrücke bei Objekten werden "regelmäßig" (mehrmals pro Sekunde) neu berechnet, solange sich die Objekte in sichtbarer Entfernung befinden
  • Nicht-konstante, logische Ausdrücke bei Sounds, werden "regelmäßig" (mehrmals pro Sekunde) neu berechnet, solange sich die Lok im Gültigkeitsbereich des Sounds befindet
  • Derzeit (Version 2.8) werden keinerlei Optimierungen der Ausdrücke vorgenommen!
'Persönliche Werkzeuge