Next: , Previous: , Up: Arithmetic   [Contents][Index]


3.1.4.1 Two-operand (binary) forms and precedence

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.

LeftOpRightResultDescription
scalar+scalar scalarScalar sum.
vector+vectorvectorVector sum.
point+vectorpointPoint-vector affine sum.
vector+point""
scalar-scalar scalarScalar difference.
vector-vectorvectorVector difference.
point-pointvectorPoint-point affine difference.
point-vectorpointPoint-vector affine difference.
scalar* or .scalar scalarScalar product.
scalar* or .vectorvectorScalar-vector product.
vector* or .scalar""
vector*vectorvectorVector cross-product.
vector.vectorscalarVector dot product.
scalar^scalar scalarRaise scalar to scalar power.
transform^integertransformRaise transform to integer power.
transform* or .pointpointAffine point transform (right-to-left).
transform* or .vectorvectorAffine vector transform (right-to-left).
transform* or .transformtransformTransform composition (right-to-left).
pointthentransform pointAffine point transform (left-to-right).
vectorthentransformvectorAffine vector transform (left-to-right).
transformthentransformtransformTransform composition (left-to-right).
scalar/scalar scalarScalar division.
vector/scalarvectorVector component-wise division by scalar.
point'x, y, or z scalarPoint component extraction.
vector'x, y, or zscalarVector component extraction.

Operator precedence is shown in this table.

OpPrecedence
'highest (most tightly binding)
^
-(unary negation)
* . /
+ -
thenlowest (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: , Previous: , Up: Arithmetic   [Contents][Index]