[ITK-dev] Compositions in ScaleVersor3D and ScaleSkewVersor3D Transforms

Bradley Lowekamp blowekamp at mail.nih.gov
Fri Dec 12 12:11:13 EST 2014


Hello,

This seems very wrong to me...

I was looking into the inverse of the classes. And I saw how the matrix was composed from the scale and versor components[1]

  newMatrix[0][0] = m_Scale[0] - 2.0 * ( yy + zz );
  newMatrix[1][1] = m_Scale[1] - 2.0 * ( xx + zz );
  newMatrix[2][2] = m_Scale[2] - 2.0 * ( xx + yy );
  newMatrix[0][1] = 2.0 * ( xy - zw )  + ( m_Skew[0] );
  newMatrix[0][2] = 2.0 * ( xz + yw )  + ( m_Skew[1] );
  newMatrix[1][0] = 2.0 * ( xy + zw )  + ( m_Skew[2] );
  newMatrix[1][2] = 2.0 * ( yz - xw )  + ( m_Skew[3] );
  newMatrix[2][0] = 2.0 * ( xz - yw )  + ( m_Skew[4] );
  newMatrix[2][1] = 2.0 * ( yz + xw )  + ( m_Skew[5] );

Similarly both classes just add the scale/skew component and don't do correct matrix composition.

Let R be the versor, S scale, and K skew matrices, and p be a point.

Currently we have:

(R+S+K)*p = R*p+S*p+K*p

Where I expected these classes would be implementing:

R*S*K*p

which is a traditional composition of transform matrices.

Anyone know where the current math came from? Or what it's really doing?

Is this something that we should fix/improve/evaluate? Or just document what's actually happening?

Brad




[1] https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Transform/include/itkScaleVersor3DTransform.hxx#L219-L227


More information about the Insight-developers mailing list