Using Math Template
Math templates provide a way to re-use formulas between many Volume Maths processes.
- In the Volume Maths process, scroll to the Formula section.
- Click the blue folder icon to view the Math Template menu.
- Select Template: Open the Select a Math Template window.
- Create Template: Open the Create a new Math Template window.
- Copy and Edit Template's Formula: Shows the formula in the Formula text-box and allow editing to be done.
- Edit Template: Open the Edit a Math Template window to edit and update the selected template.
- Clear Template: Remove formula from the Formula text-box.
Name: The names of math templates have a few requirements due to their use in math formulas:
- Names must be unique. This is case insensitive, so "tree" and "Tree" will be considered clashing names.
- Names can only use alphanumeric characters. This means that they cannot contain spaces or special characters.
- Names cannot start with a number.
- Names cannot be one of the reserved words for maths formulas. e.g. You would not be able to name a math template "e", "pi", or "sin".
- Description: The description can be used to explain the functionality and inputs of your template to other users.
- Formula: The remainder of this document describes all the things you can do in the Formula. It's case-insensitive (i.e. upper- and lower-case letters are equivalent).
Use the Select a Math Template window to find and select existing templates to use.
- Search a template by the Name, Owner, Description and/or Label.
- Template table: Select the preferred template from the table.
- Content panel: Shows the content of the selected template.
- Click the Select button to add the selected template.
This window will close and the formula will be added to the formula text-box.
- In the Volume Maths process, scroll to the Formula section.
- Select the blue folder icon and click Select Template.
- To Export a template
- In the table, select the preferred template.
- Click the Export button.
- Browse the location and type a name.
- Click Save.
- To Import a template
- Click the Import button
- Select the *.maths file to import.
- Click Open.
- If an existing template name exist, please type a new name in the pop-up window.
- Click Cancel to close the window.
Variables may have a value at a particular location, or they may be missing/invalid. Missing/invalid values are represented by 'NaN' (Not A Number). Volume Maths provides its own set of variables that you may use in your formula. See the help of the Volume Maths process to see the variables available within it.
If you are re-using the same value multiple times, or if you wish to organise your equations, defining your own variables can be very useful (and sometimes even more efficient!).
- The variable name appears on the left, followed by an equals sign (=), your expression, and finally a semi-colon (;).
a = v1 * 2;
res = a + sin(v1);
- The semi-colon is very important. It must be there to separate the declaration of each variable.
% Modulo: A%B yields the remainder of A divided by B
^ Power: A^B raises A to the power of B
In the absence of any operator, multiplication is assumed. Thus, 5 a will be interpreted as 5 * a. For other operators, see also the Conditions sections for boolean operations, and the Bitwise Operators section below.
Maths operations support a number of bitwise operators. These can be useful for setting flags in headers, but these are not boolean operations. Some care must be taken:
- Only the integer part of a value is considered
- Operations consider which bits are set in that integer value
As a consequence, these differ from conditional operations (if, && etc) which treat any non-zero value as one (true)
a xor b Exclusive OR: sets bits in the output only where they differ in the inputs, according to the following table.
a & b Bitwise AND: performs a logical AND on each bit in the inputs, and sets the corresponding output bit to the result.
a | b Bitwise OR: performs a logical OR on each bit in the inputs, and sets the corresponding output bit to the result.
~a 1's complement: performs a bitwise NOT, inverting all bits in the value. Note that the integer representation is signed, so this is equivalent to (-a - 1).
* Simplified to show an 8 bit representation
You can build complex expressions that result in different behaviour in different situations. Conditional statements take the form:
if ( condition , true statement , false statement )
where the true statement is used if the condition is true, or vice-versa. Note that those statements can themselves be arbitrary expressions, such as another conditional statement.
Standard comparison operators may be used, which may be combined with standard boolean operators. You can preface any boolean expression with a ! to negate it:
Note: Do not use != nan or == nan to check for invalid values in conditional statements. It won't do what you think! Use one of the isnan(), isnull(), isvalid(), etc. functions instead.
if (a < 0 && b < 0, c, a + b)
If both a and b are less than zero, use the value of c; otherwise use the sum of a and b
if (a < 0, if (b < 0, c, a + b), a + b)
A more-complicated way of writing the same thing, using one conditional inside another.
if (isnan(a) || isnan(b), 1500, a + b)
If either a or b are NaN (invalid), use 1500; otherwise use the sum of a and b
The most natural-seeming way to merge two things together would be to "add" them, as in a + b + c. But this doesn't work, for two reasons.
First, in places where they overlap, that would give you the arithmetic sum of the values at that location -- which is probably not what you intend.
Second, missing values are generally represented by the value NaN (not-a-number). NaN plus any other value remains NaN, so this would have the effect of producing output only at locations where all inputs are defined. This is also probably not what you intend.
To simplify this, Insight provides several functions to make combining easy:
- merge(a, b, c, ...) - combines any number of items, in order of precedence. i.e. where they overlap, the first available value in the list will be used.
- min(a, b, c, ...) - combines any number of items, using the smallest available value
- max(a, b, c, ...) - combines any number of items, using the largest available value
- sum(a, b, c, ...) - arithmetic sum of any number of items, ignoring those that aren't defined at a location
- avg(a, b, c, ...) - arithmetic mean of any number of items, ignoring those that aren't defined at a location
- random(max) - generate a random number between 0 and max (inclusive)
- random(min, max) - generate a random number between min and max (inclusive)
- lerp(v0, v1, t) - linearly interpolates between two inputs (v0, v1) for a parameter (t) in the closed unit interval [0, 1]. Parameter t is clamped between 0 and 1.
You can use comments to explain your formulas to other users.
- Comments are started by a hash #, and extend to the end of that line. Anything written within a comment will be ignored in the formula.
# Comments can appear on their own line.
a = v1 * 2;
res = a + sin(v1); # Or at the end of other lines.
pimp^2 - 2 * simp^2
Will create a Lambda-Rho volume (pimp squared minus 2 times simp squared)
if (!IsNaN(a), a, b)
Will use the value of volume "a" for a sample if it exists, otherwise the value of volume "b".
if (d_m < h1, 1500, v1)
Will make a copy of volume "v1", with any sample shallower than "h1" (a horizon) set to 1500.