Instantly share code, notes, and snippets.

# pervognsen/hopf.txt Last active Feb 17, 2017

What would you like to do?
 This note is in response to this article, particularly the final section on three degrees of freedom: http://marc-b-reynolds.github.io/distribution/2017/01/27/UniformRot.html It notes that "Marsaglia hand-wavingly presented a method for the 4D sphere". I hope to give some insight into how this method may be obtained and how it relates to some relatively commonplace mathematical ideas. The unit quaternions may be embedded in C^2 as pairs of complex numbers (z1, z2) satisfying |z1|^2 + |z2|^2 = 1. If we write z1 and z2 in polar coordinates as z1 = r1 exp(i t1) and z2 = r2 exp(i t2), this is equivalent to r1^2 + r2^2 = 1, and hence t1 and t2 are unconstrained and may be chosen arbitrarily. The equation for r1 and r2 is just the formula for a unit circle in R^2, so its solutions may be parameterized in polar coordinates as well: r1 = cos(s) and r2 = sin(s) where s is a real number. Hence a unit quaternion through this embedding may be written in the form z1 = cos(s) exp(i t1) z2 = sin(s) exp(i t2) It's clear that t1 and t2 vary freely between 0 and 2 pi, and s must be restricted between 0 and pi/2 to obtain a unique parameterization, so that cos(s) and sin(s) are both between 0 and 1 (sign changes can be expressed as phase changes to t1 and t2). These are the so-called Hopf coordinates. Related ideas such as the Hopf fibration play a key role in topology. To see how volume is distorted in this coordinate system, we will pull back the volume form from C^2. If we fix s at some value, varying t1 traces out a circle and varying t2 independently traces out an orthogonal circle, generating a torus. The length of the t1 circle is scaled by cos(s) and the length of the t2 circle is scaled by sin(s), and hence the area of the torus in C^2 is scaled by cos(s) sin(s) relative to area in the (t1, t2) domain. This is a loose argument that the volume form's pullback is cos(s) sin(s) ds /\ dt1 /\ dt2. To make a more direct connection with the uniform_quat algorithm, change coordinates from s to u = sin(s). We get du = cos(s) ds, so the volume form becomes sin(s) du /\ dt1 /\ dt2 = u du /\ dt1 /\ dt2. Then z1 = u exp(i t1) and z2 = sqrt(1 - u^2) exp(i t2) where u now varies between 0 and 1. Imagine picking z1 and z2 sequentially, so that z1's coordinates are first picked as a point within the unit disk, and then z2's coordinates are picked as a point on the circle of radius sqrt(1 - |z1|^2) = sqrt(1 - u^2). Rather than doing the second part directly, it picks an arbitrary point within the unit disk and then rescales the result to the proper radius. This accounts for the factor of u in the volume form, so that the distribution becomes uniform.