16.2.7 Paced animation and complex types

Paced animations assume a notion of distance between the various animation values defined by the 'to', 'from', 'by' and 'values' attributes. The following table explains how the distance between values of different types should be computed.

Distance is defined for types which can be expressed as a list of values, where each value is a vector of scalars in an n-dimensional space. For example, an angle value is a list of one value in a 1-dimensional space and a color is a list of 1 value in a 3-dimensional space.

Animation is based on the computed value of properties. Thus, keywords such as inherit which yield a computed value may be animated because the computed value is a scalar or list of scalars. For example, fill="inherit" may be animated if the computed value of fill is a color.

The following table uses the following notation to describe two values for which a distance should be computed:
Va = {va0, va1, ..., van}
Vb = {vb0, vb1, ..., vbn}


Value Type Description Distance Examples
angle, integer, length, coordinate single 1-dimensional value. va0[0] = scalarA
vb0[0] = scalarB
||VaVb|| = abs(scalarA- scalarB) 'x' attribute on 'rect'
stroke-width on <circle>
color single 3-dimensional value.
va0[0] = colorA
vb0[0] = colorB
||VaVb|| = sqrt((colorA.getRed() - colorB.getRed())^2 + (colorA.getGreen() - colorB.getGreen())^2 + (colorA.getBlue() - colorB.getBlue())^2) 'fill' attribute on 'ellipse'
list of length
n 1-dimensional values. ||VaVb|| = sum(for i = 1 to n, abs(vai[0] - vbi[0])) / n 'stroke-dasharray' on 'path'
list of points n 2-dimensional values There is no defined formula to pace a list of points. The request to pace should be ignored and the value of linear used instead. 'points' attribute on 'polygon'
path n 2-dimensional values where each value is a point in the path definition. ||VaVb|| = sum(for i = 1 to n, dist(vai,vbi)) / n
dist(vai,vbi) = sqrt((vai[0] - vbi[0])^2 + (vai[1] - vbi[1])^2))
'd' on 'path'
transform list type: translate
one 2-dimensional value
va0[0] = txa
va0[1] = tya
vb0[0] = txb
vb0[1] = tyb
type: rotate one 1-dimensional value and 1 2-dimensional value
va0[0] = angleA
va1[0] = cxa
va1[1] = cya

vb0[0] = angleB
vb1[0] = cxb
vb1[1] = cyb

type: scale
two 1-dimensional values
va0[0] = scaleXa
va1[0] = scaleYa
vb0[0] = scaleXb
vb1[0] = scaleYb

type: skewX, skewY
single 1-dimension value
va0[0] = skewXorYa
vb0[0] = skewXorYb
type: translate
||VaVb|| = dist(v_a0 ,v_b0 ) = sqrt((v_a0 [0] - v_b0 [0])^2 + (v_a0 [1] - v_b0 [1])^2))

type: rotate
||VaVb|| = (abs(angleA - angleB) + sqrt((v_a1 [0] - v_b1 [0])^2 + (v_a1 [1] - v_b1 [1])^2))) / 2

type: scale
||VaVb|| = (abs(scaleXa- scaleXb) + abs(scaleYa - scaleYb)) / 2

type: skewX, skewY
||VaVb|| = abs(skewXorYa- skewXorYb)
'transform' attribute on 'g' using 'animateTransform'