Improper Rotations edit page

A proper rotation preserves lengths, angles, and handedness. An improper rotation also preserves lengths and angles, but changes a right-handed object into its mirror image. The name is historical: improper does not mean invalid, and such a transformation cannot be made by physically turning a rigid object.

This page assumes the active action rot * v and the matrix representation introduced in Defining Rotations.

Proper and improper transformations together form the orthogonal group O(3). Its proper part is the rotation group SO(3). MTEX stores both in the rotation class and records which part an object belongs to with an inversion flag.

plottingConvention.default('y↑→x');

The Inversion

The inversion sends every direction to its opposite. The named constructor is rotation.inversion.

I = rotation.inversion;

I * vector3d.X
ans = vector3d (y↑→x)
   x  y  z
  -1  0  0

The result is \((-1,0,0)\). Unary minus on a rotation toggles its inversion flag, so the inversion can also be written as the negative identity.

I == -rotation.id
ans =
  logical
   1

Do not confuse unary minus with inv. inv(turn) undoes a turn, whereas -turn combines the same proper part with the inversion. The first result below is proper and the second is improper.

turn = rotation.byAxisAngle(vector3d.Z,30*degree);

isImproper([inv(turn),-turn])
ans =
  1×2 logical array
   0   1

Reflection in a Plane

A reflection leaves every direction in its mirror plane fixed and reverses the component normal to the plane. In MTEX, reflection takes the plane normal as its argument.

planeNormal = vector3d(1,1,1);
mir = reflection(planeNormal);

The same transformation is a half turn about the plane normal followed by the inversion.

mir == -rotation.byAxisAngle(planeNormal,180*degree)
ans =
  logical
   1

The direction \((1,-1,0)\) is perpendicular to the normal and therefore lies in the mirror plane. It is unchanged.

mir * vector3d(1,-1,0)
ans = vector3d (y↑→x)
  x  y  z
  1 -1  0

The plane normal is perpendicular to the mirror and changes sign.

mir * planeNormal
ans = vector3d (y↑→x)
   x  y  z
  -1 -1 -1

The grey patch below is the mirror plane. The black direction and its red image have equal components within the plane and opposite components along the blue normal.

n = normalize(planeNormal);
v = normalize(vector3d(1,-0.2,0.5));
mirroredV = mir * v;

axis([-1.3 1.3 -1.3 1.3 -1.3 1.3])
plot(plane3d(n,0),'FaceColor',[0.75 0.75 0.75],'EdgeColor','none')
hold on
arrow3d(v,'FaceColor','black')
arrow3d(mirroredV,'FaceColor','red')
arrow3d(n,'FaceColor','blue')
hold off
axis equal off

Parity under Composition

isImproper reports whether a transformation reverses handedness. A single reflection is improper, whereas composing two reflections restores handedness.

mirrorX = reflection(vector3d.X);
mirrorY = reflection(vector3d.Y);

isImproper([mirrorX,mirrorX*mirrorY])
ans =
  1×2 logical array
   1   0

The two-reflection product is the proper half turn about Z. Their angular difference is zero degrees.

angle(mirrorX*mirrorY,...
  rotation.byAxisAngle(vector3d.Z,180*degree)) ./ degree
ans =
     0

Improper Operations in Crystal Symmetry

Crystal point groups may contain both kinds of operation. For the mixed point group \(\bar{4}m2\), the displayed values are the total number of operations, the number of proper operations, and the number of improper operations.

cs = crystalSymmetry('-4m2');
ops = rotation(cs);
improperFlags = isImproper(ops);

[length(ops),sum(~improperFlags(:)),sum(improperFlags(:))]
ans =
     8     4     4

Only the proper operations are physical turns that superpose the crystal on itself. properSubGroup retains those four operations. Do not confuse it with properGroup, which returns the associated enantiomorphic group and has eight operations in this example.

[length(rotation(cs.properSubGroup)),...
  length(rotation(cs.properGroup))]
ans =
     4     8

The Matrix Test

The matrix of every length-preserving linear transformation is orthogonal. Its determinant is \(+1\) for a proper rotation and \(-1\) for an improper transformation.

proper = rotation.id;
improper = rotation.inversion;

[det(matrix(proper)),det(matrix(improper))]
ans =
     1    -1

MTEX stores an improper transformation as a proper quaternion together with the inversion flag. Axis-angle and Euler values therefore describe only that stored proper part. Use isImproper or matrix when the handedness of the full transformation matters.

References

Next

Operations covers composition, inversion, and action on directions. Crystal Symmetries develops proper, Laue, and mixed point groups and explains the difference between properSubGroup and properGroup.

Citing this page. This page is part of the documentation of MTEX, a free and open source MATLAB toolbox for analyzing and modeling crystallographic textures. It was written by The MTEX Developers and is published at https://mtex-toolbox.github.io/RotationImproper.html. If you use MTEX, or reuse text or figures from this page, in your research, please cite

F. Bachmann, R. Hielscher, H. Schaeben: Texture Analysis with MTEX - Free and Open Source Software Toolbox, Solid State Phenomena 160 (2010), 63-68. 10.4028/www.scientific.net/SSP.160.63

BibTeX
@article{bachmann2010mtex,
  author  = {F. Bachmann and R. Hielscher and H. Schaeben},
  title   = {Texture Analysis with MTEX - Free and Open Source Software Toolbox},
  journal = {Solid State Phenomena},
  volume  = {160},
  pages   = {63-68},
  year    = {2010},
  doi     = {10.4028/www.scientific.net/SSP.160.63},
  url     = {https://doi.org/10.4028/www.scientific.net/SSP.160.63}
}

Other papers describing specific MTEX methods are listed under Publications — please cite the one that best fits your application. The MTEX source code is licensed under the GNU General Public License v2.0; the text and figures of this documentation are licensed under CC BY 4.0, which permits reuse — including by automated systems — provided The MTEX Developers and this page are credited.