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]