In the Real Projective Spaces and 3x3 Rotation Matrices vignette, it is shown that there is a homeomorphism between \(P_4^\pi\), the space of balanced configurations of 4 or 2 points on the circle, and \(\text{SO(3)}\), the space of 3x3 rotation matrices. These functions implement the homeomorphim and its inverse.
rotationfromarcs( arcmat, tol=5.e-9 )
arcsfromrotation( rotation, tol=1.e-7 )
rotationaroundaxis( axis, theta )rotationfromarcs() maps from \(P_4^\pi\) to \(\text{SO(3)}\);
it returns a 3x3 rotation matrix.
arcsfromrotation() maps from \(\text{SO(3)}\) to \(P_4^\pi\);
the returned set of arcs (either 1 or 2 of them) is only defined up to complementation.
Since all we want is the endpoints, the ambiguity does not matter.
The total length of the arcs is \(\pi\).
rotationaroundaxis() returns a 3x3 rotation matrix
which rotates theta radians around the given axis.
In case of error, all these functions return NULL.
a 2x2 or 1x2 matrix with an arc definition in each row;
so the number of arcs is 2 or 1.
The 1st number in the row is the center of the arc,
and the 2nd number is the length of the arc;
both in radians.
The total length must be \(\pi\), and this is tested.
If there is only one arc, it must be a semicircle.
Only the endpoints of arcmat matter;
the complement of the arcs maps to the same rotation.
In rotationfromarcs() tol is the tolerance for the test that the total
arc length is \(\pi\).
In arcsfromrotation() tol is the tolerance for testing that the mapped point
in \(\partial Z_4\) is close to the substratum \(\partial Z_2\).
This is to avoid generating 2 arcs, one of which is very tiny.
a 3x3 rotation matrix. The numeric 3x3 matrix property is verified, but, in the interest of speed, orthogonality and orientation-preservation is not verified.
a non-zero 3-vector defining an oriented axis in \(\mathbb{R}^3\).
axis is not required to be a unit vector.
an angle in radians. The computed rotation matrix rotates by this angle.
As currently implemented, a 2-point configuration in \(P_2^\pi\), whose points must be antipodal, maps to a rotation around the x-axis. The configuration of the 2 points \((0,\pm 1)\) maps to the 3x3 identity matrix. See the Real Projective Spaces and 3x3 Rotation Matrices vignette, for an animation of this.
boundaryfromarcs(),
spherefromboundary(),
boundaryfromsphere(),
arcsfromboundary(),
complementaryarcs()