Next: Unary forms, Previous: Arithmetic, Up: Arithmetic [Contents][Index]
Most two-operand binary forms have meanings dependent on the types of their arguments. An exhaustive summary of the possibilities is given in the following table.
| Left | Op | Right | Result | Description |
|---|---|---|---|---|
| scalar | + | scalar | scalar | Scalar sum. |
| vector | + | vector | vector | Vector sum. |
| point | + | vector | point | Point-vector affine sum. |
| vector | + | point | " | " |
| scalar | - | scalar | scalar | Scalar difference. |
| vector | - | vector | vector | Vector difference. |
| point | - | point | vector | Point-point affine difference. |
| point | - | vector | point | Point-vector affine difference. |
| scalar | * or
. | scalar | scalar | Scalar product. |
| scalar | * or
. | vector | vector | Scalar-vector product. |
| vector | * or
. | scalar | " | " |
| vector | * | vector | vector | Vector cross-product. |
| vector | . | vector | scalar | Vector dot product. |
| scalar | ^ | scalar | scalar | Raise scalar to scalar power. |
| transform | ^ | integer | transform | Raise transform to integer power. |
| transform | * or
. | point | point | Affine point transform (right-to-left). |
| transform | * or
. | vector | vector | Affine vector transform (right-to-left). |
| transform | * or
. | transform | transform | Transform composition (right-to-left). |
| point | then | transform | point | Affine point transform (left-to-right). |
| vector | then | transform | vector | Affine vector transform (left-to-right). |
| transform | then | transform | transform | Transform composition (left-to-right). |
| scalar | / | scalar | scalar | Scalar division. |
| vector | / | scalar | vector | Vector component-wise division by scalar. |
| point | ' | x, y, or z
| scalar | Point component extraction. |
| vector | ' | x, y, or z | scalar | Vector component extraction. |
Operator precedence is shown in this table.
| Op | Precedence |
|---|---|
' | highest (most tightly binding) |
^ | |
- | (unary negation) |
*
.
/ | |
+
- | |
then | lowest (least tightly binding) |
All operations are left-associative except for ‘^’. Parentheses ‘( )’ are used for grouping to override precedence in the usual way.
As you can see, the dot operator ‘.’
is usually a synonym for run-of-the-mill multiplication, ‘*’.
The meanings differ only for vector operands. The then
operator
merely reverses the operand
order with respect to normal multiplication ‘*’. The intent
here is to make compositions read more naturally. The code
(1,2,3) then scale(2) then rotate(30) then translate([1,3,0])
expresses a series of successive modifications to the point, whereas the equivalent form
translate([1,3,0]) * rotate(30) * scale(2) * (1,2,3)
will be intuitive only to mathematicians (and perhaps Arabic language readers).
Next: Unary forms, Previous: Arithmetic, Up: Arithmetic [Contents][Index]