Expressions
(Redirected from Expression)
Jump to navigation
Jump to search
| This article is a stub. You can help the wiki by expanding it. |
Expressions (or SGExpressions) are a feature of the SimGear library and provide a nice way of implementing complex math formulas using XML syntax.
They are supported in many systems within the FlightGear code.
| Caution Expressions do not check if your math creates floating point exceptions (like division by zero conditions, taking the square root of a negative number, etc.). This can cause undefined behavior and may result in NaNs or even Cascading NaNs. |
Usage
Expressions are supported in
- Autopilot configuration files
- Particle system configuration files
- Animations (translate, rotate, scale, range, blend)
- The shader technique
- Conditions
Sample Expressions
This is a sample expression for c = sqrt(a*a + b^2). Children/arguments are parsed in the order they appear in in the file (or the order in which they are set via property methods).
<expression>
<sqrt>
<sum>
<product>
<property>/value/a</property>
<property>/value/a</property>
</product>
<pow>
<property>/value/b</property>
<value>2</value>
</pow>
</sum>
</sqrt>
</expression>
Supported elements
<abs> <!-- also: fabs -->
<acos>
<asin>
<atan>
<atan2>
<ceil>
<clip> <!-- <clipMin> <clipMax> -->
<cos>
<cosh>
<difference> <!-- also: dif -->
<div>
<exp>
<floor>
<log>
<log10>
<max>
<min>
<mod>
<pow>
<product> <!-- also: prod -->
<property> <!-- Unlike elsewhere, 'prop' does not work in expressions. -->
<rad2deg>
<deg2rad>
<sin>
<sinh>
<sqr>
<sqrt>
<sum>
<table> <!-- <entry><ind> value </ind><dep> value </dep></entry> -->
<tan>
<tanh>
<value>
Table
The table expression uses the following syntax, similarly to the <interpolation> element:
<table>
<!-- put an input element here, this can be <property> or any other operation
<entry>
<ind>0.0</ind> <!-- the value of the input (independent value) -->
<dep>0.0</dep> <!-- the value of the output (dependent value) -->
</entry>
... <!-- you can put as many entries as you want -->
</table>
Example
The table:
| 0.0 | 5.0 |
| 0.5 | 7.5 |
| 0.9 | -5.0 |
| 1.0 | 25.0 |
translates to the following code:
<table>
<!-- put an input element here, this can be a <property> or any other operation -->
<entry>
<ind>0.0</ind>
<dep>5.0</dep>
</entry>
<entry>
<ind>0.5</ind>
<dep>7.5</dep>
</entry>
<entry>
<ind>0.9</ind>
<dep>-5.0</dep>
</entry>
<entry>
<ind>1.0</ind>
<dep>25.0</dep>
</entry>
</table>
Clip
An expression to limit e.g. rotation:
<expression>
<clip>
<clipMin>-45</clipMin>
<clipMax>45</clipMax>
<property>orientation/pitch-deg</property>
</clip>
</expression>
Hints and tips
Rounding
While there is no element for rounding, this workaround can be used for that:
<expression>
<floor>
<sum>
<property>your/property/here</property>
<value>0.5</value>
</sum>
</floor>
</expression>