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.Xans = vector3d (y↑→x)
x y z
-1 0 0The 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.idans =
logical
1Do 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 1Reflection 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
1The 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 0The plane normal is perpendicular to the mirror and changes sign.
mir * planeNormalans = vector3d (y↑→x)
x y z
-1 -1 -1The 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 0The 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)) ./ degreeans =
0Improper 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 4Only 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 8The 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 -1MTEX 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
- The International Union of Crystallography, Symmetry operation, classifies inversion, reflections, and rotoinversions as operations that relate enantiomorphous objects.
- G. Rigault, Metric tensor and symmetry operations in crystallography, IUCr Teaching Pamphlet 10, derives the determinant classification and the crystallographic point groups.
- Z. Dauter and M. Jaskolski, How to read (and understand) Volume A of International Tables for Crystallography: an introduction for nonspecialists, Journal of Applied Crystallography 43 (2010) 1150--1171, connects proper rotations and rotoinversions to Hermann--Mauguin notation.
- A. Morawiec, Orientations and Rotations: Computations in Crystallographic Textures, Springer, 2004, develops the rotation and symmetry framework used in texture analysis.
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.