4.1. Getting the transform of a StructuredGrid¶
4.1.1. Representation of transformations as matrix¶
The location and orientation of a ORSModel.ors.StructuredGrid
, representing his coordinate system,
are expressed as an affine transformation in an instance of Matrix4x4.
The representation of a Matrix4x4 instance is:
orsMatrix(v00, v01, v02, v03,
v10, v11, v12, v13,
v20, v21, v22, v23,
v30, v31, v32, v33)
This matrix is used to represent the affine transformation
to go from the coordinate system A to the coordinate system B
as a 3x3 rotation and scale matrix (identified as R_A_to_B
) and a 3x1 translation vector
(identified as T_A_to_B
):
M_A_to_B = orsMatrix(r00, r01, r02, tx,
r10, r11, r12, ty,
r20, r21, r22, tz,
0, 0, 0, 1)
= [[. . .] [ . ]
[. R_A_to_B .] [ T_A_to_B ]
[. . .] [ . ]
[0 0 0] [ 1 ]]
A vector v_A
expressed in the coordinate system A can be transformed in the coordinate system B
by a matrix product of the 3x3 rotation and scale matrix R_A_to_B
:
v_B = R_A_to_B * v_A
= [r00 r01 r02] [v0]
[r10 r11 r12] [v1]
[r20 r21 r22] [v2]
= [r00*v0 + r01*v1 + r02*v2]
[r10*v0 + r11*v1 + r12*v2]
[r20*v0 + r21*v1 + r22*v2]
Similarly, a coordinate c_A
expressed in the coordinate system A can be transformed in the coordinate system B
by a matrix product of the 3x3 rotation and scale matrix R_A_to_B
and adding the 3x1 translation vector T_A_to_B
:
c_B = R_A_to_B * c_A + T_A_to_B
= [r00 r01 r02] [c0] [tx]
[r10 r11 r12] [c1] + [ty]
[r20 r21 r22] [c2] [tz]
= [r00*c0 + r01*c1 + r02*c2 + tx]
[r10*c0 + r11*c1 + r12*c2 + ty]
[r20*c0 + r21*c1 + r22*c2 + tz]
For an instance of StructuredGrid, this transformation matrix is contained in a Box instance:
aBox = aStructuredGrid.getBox()
The method ORSModel.ors.Box.getWorldTranformation()
gives the transformation to go
from the coordinate system of the current box to the world coordinate system:
transformationMatrixFromLocalToWorld = aBox.getWorldTranformation()
4.1.2. Transformations of a constructed StructuredGrid¶
Let’s examine the transformation matrix of an instance ROI, being a subclass of StructuredGrid, as changes in the coordinate system are made:
from ORSModel import ROI, Matrix4x4, orsColor, orsVect
aROI = ROI()
aROI.setTitle('Demo ROI')
# Setting the size
aROI.setXSize(100)
aROI.setYSize(200)
aROI.setZSize(400)
aROI.setTSize(1)
# Observation of the current transformation
aROI.getBox().getWorldTranformation()
# orsMatrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) # Unit matrix
# Setting the voxel dimensions
aROI.setXSpacing(0.001)
aROI.setYSpacing(0.010)
aROI.setZSpacing(0.100)
# Observation of the current transformation
aROI.getBox().getWorldTranformation()
# orsMatrix(0.001, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 1) # Notice the scaling factors in r00, r11 and r22
# Setting the orientation using the Box member of the StructuredGrid
# The original orientation (aligned with the world) is turned 30 degrees around the y axis.
rotationAxis = orsVect(0, 1, 0)
rotationTransform = Matrix4x4()
rotationTransform.setAsRotation(rotationAxis, 3.1416/6)
aROIBox = aROI.getBox()
aROIBox.transform(rotationTransform)
aROI.setBox(aROIBox)
# Observation of the current transformation
aROI.getBox().getWorldTranformation()
# orsMatrix(0.000866024792, 0, 0.050000106, 0, 0, 0.01, 0, 0, -0.00050000106, 0, 0.0866024792, 0, 0, 0, 0, 1)
# The origin is put at the world coordinate (2, 0, 0)
aROI.setOrigin(orsVect(2, 0, 0))
# Observation of the current transformation
aROI.getBox().getWorldTranformation()
# orsMatrix(0.000866024792, 0, 0.050000106, 2, 0, 0.01, 0, 0, -0.00050000106, 0, 0.0866024792, 0, 0, 0, 0, 1) # Notice tx is now 2.0
# Setting a color
aROI.setInitialColor(orsColor(1, 0, 0, 1))
# Filling the ROI by inverting the empty ROI (to see something in the views)
aROI.getReversed(aROI)
# Publish it so that it will be visible in the Object properties list
aROI.publish()