Compatible with:

DOS Maximite CMM MM150 MM170 MM+ MMX Picromite ArmiteL4
Armite F4 ArmiteH7 CMM2

Syntax:

**MATH xxx**

Description:

The math command performs many simple mathematical calculations that can be
programmed in BASIC but there are speed advantages to coding looping structures
in the firmware and there is the advantage that once debugged they are there for
everyone without re-inventing the wheel.

Note: 2 dimensional maths matrices are always specified DIM matrix(n_columns,
n_rows) and of course the dimensions respect OPTION BASE.

Quaternions are stored as a 5 element array w, x, y, z, magnitude.

Also see the MATH() function and MATH FFT command

**Simple array arithmetic**

**MATH SET nbr, array()**

Sets all elements in array() to the value nbr.

Note this is the fastest way of clearing an array by setting it to zero.

**MATH ADD in(), num, out()**

This adds the value 'num' to every element of the matrix in() and puts the
answer in out(). Works for arrays of any dimensionality of both integer and
float and can convert between.

Setting 'num' to 0 is optimised and is the fastest way of copying an entire array.
in() and out() can be the same array.

**MATH INTERPOLATE in1(), in2(), ratio, out()**

This command This implements the following equation on every array
element:

out = (in2 - in1) * ratio + in1

Arrays can have any number of dimensions and must be distinct and have the same
number of total elements. The command works with both integer and floating point
arrays in any mixture

**MATH SCALE in(), scale ,out()**

This scales the matrix in() by the scalar scale and puts the answer in out().
Works for arrays of any dimensionality of both integer and float and can convert
between.

Setting 'scale' to 1 is optimised and is the fastest way of copying an entire array.

**MATH SLICE sourcearray(), [d1] [,d2] [,d3] [,d4] [,d5] , destinationarray()**

This command copies a specified set of values from a multi-dimensional array
into a single dimensional array.

It is much faster than using a FOR loop.

The slice is specified by giving a value for all but one of the source array
indicies and there should be as many indicies in the command, including the
blank one, as there are dimensions in the source array

e.g.

OPTION BASE 1

DIM a(3,4,5)

DIM b(4)

MATH SLICE a(), 2, , 3, b()

Will copy the elements 2,1,3 and 2,2,3 and 2,3,3 and 2,4,3 into array b()

**MATH INSERT targetarray(), [d1] [,d2] [,d3] [,d4] [,d5] , sourcearray()**

This is the opposite of MATH SLICE and allows you, for example, to substitute a
single vector into an array of vectors with a single instruction

e.g.

OPTION BASE 1

DIM target(3,4,5)

DIM source(4)=(1,2,3,4)

MATH INSERT target(), 2, , 3, source()

Will set elements 2,1,3 = 1 and 2,2,3 = 2 and 2,3,3 = 3 and 2,4,3 = 4

**Matrix arithmetic**

**MATH M_PRINT array()**

Quick mechanism to print a 2D matrix one row per line.

**MATH M_TRANSPOSE in(), out()**

Transpose matrix in() and put the answer in matrix out(), both arrays must be 2D
but need not be square.

If not square then the arrays must be dimensioned in(m,n) out(n,m)

**MATH M_MULT in1(), in2(), out()**

Multiply the arrays in1() and in2() and put the answer in out()c. All arrays
must be 2D but need not be square.

If not square then the arrays must be dimensioned in1(m,n) in2(p,m) ,out(p,n)

**MATH INTERPOLATE in1(), in2(), ratio, out()**

This command This implements the following equation on every array element: out
= (in2 - in1) * ratio + in1

Arrays can have any number of dimensions and must be distinct and have the same
number of total elements.

The command works with both integer and floating point arrays in any mixture

**Vector arithmetic**

**MATH V_PRINT array()**

Quick mechanism to print a small array on a single line

**MATH V_NORMALISE inV(), outV()**

Converts a vector inV() to unit scale and puts the answer in outV() (sqr(x*x +
y*y +.......)=1

There is no limit on number of elements in the vector

**MATH V_MULT matrix(), inV(), outV()**

Multiplies matrix() and vector inV() returning vector outV().

The vectors and the 2D matrix can be any size but must have the same
cardinality.

**MATH V_CROSS inV1(), inV2(), outV()**

Calculates the cross product of two three element vectors inV1() and inV2() and
puts the answer in outV()

**Quaternion arithmetic**

**MATH Q_CREATE theta, x, y, z, outRQ()**

Generates a normalised rotation quaternion outRQ() to rotate quaternion vectors
around axis x,y,z by an angle of theta.

Theta is specified in radians but respects the setting of OPTION ANGLE

**MATH Q_EULER yaw, pitch, roll, q()
**Generates a normalised rotation quaternion q() to rotate quaternion vectors
as defined by the yaw, pitch and roll angles

With the vector in front of the “viewer” yaw is looking from the top of the ector and rotates clockwise, pitch rotates the top away from the camera and roll rotates around the z-axis clockwise.

The yaw, pitch and roll angles default to radians but respect the setting of OPTION ANGLE

**MATH Q_INVERT inQ(), outQ()**

Invert the quaternion in inQ() and put the answer in outQ()

**MATH Q_MULT inQ1(), inQ2(), outQ()**

Multiplies two quaternions inQ1() and inQ2() and puts the answer in outQ()

**MATH Q_ROTATE , RQ(), inVQ(), outVQ()**

Rotates the source quaternion vector inVQ() by the rotate quaternion RQ() and
puts the answer in outVQ()

**MATH Q_VECTOR x, y, z, outVQ()**

Converts a vector specified by x , y, and z to a normalised quaternion vector
outVQ() with the original magnitude stored

Last edited: 15 December, 2020