Mathematics 138 -- reflections, rotations, translations, and horolations in hyperbolic geometry

The standard basis and polarity for hyperbolic geometry

e1 := {1, 0, 0}; e2 := {0, 1, 0}; 
    e3 := {0, 0, 1};
B = {e1, e2, -e3}

The reflection rule

Reflect[point_, pole_] := 
      point - (2*point . B . pole)*pole

Case 1: reflections in lines through the origin.
      The pole for such a line, at angle α with the x axis, is

RotPole[α_] := {-Sin[α], Cos[α], 0}

To make the matrix we apply the reflection in succession to each basis vector and assemble the results into a list. The list makes a matrix from three rows so we must take its transpose in order to have the three columns be the images of the basis vectors.

Ref1[α_] := 
      Transpose[{Reflect[e1, RotPole[α]], 
          Reflect[e2, RotPole[α]], 
          Reflect[e3, RotPole[α]]}]

Ref1[s] // MatrixForm // FullSimplify

To make a rotation we perform a product of two reflections.  The line for the first reflection is at an arbitrary angle s with the x axis.

Rot[θ_] := 
      Ref1[s + θ/2] . Ref1[s] // FullSimplify

Rot[β] // MatrixForm

These rotation matrices form a one-parameter group.

Rot[β] . Rot[γ] // FullSimplify // 
      MatrixForm

The first two columns are spacelike unit vectors, and the third is a timelike unit vector.  Any two different columns are orthogonal with respect to the polarity B.  Here is the easiest way to check this orthogonality condition.

Transpose[Rot[β]] . B . Rot[β] // FullSimplify // 
      MatrixForm

Case 2: Translations along a line through the origin. The line makes angle α with the x axis, and any spacelike point on it can be the pole of a line in which we reflect.  This is a bit more general than for the other two cases

TransPole[α_, t_] := {Cos[α]*Cosh[t], 
        Sin[α]*Cosh[t], Sinh[t]}

This pole is a spacelike unit vector.

TransPole[a, b] . B . TransPole[a, b] // Simplify

To make the matrix we apply the reflection in succession to each basis vector and assemble the results into a list. The list makes a matrix from three rows so we must take its transpose.

Ref2[α_, t_] := 
      Transpose[{Reflect[e1, TransPole[α, t]], 
            Reflect[e2, TransPole[α, t]], 
            Reflect[e3, TransPole[α, t]]}] // FullSimplify

Ref2[0, t] // MatrixForm

To make a translation we perform a product of two reflections.  The pole for the first reflection can have an arbitrary value a for the parameter.

Trans[α_, s_] := 
      Ref2[α, a + s/2] . Ref2[α, a] // FullSimplify

Here is the case where the line is the x axis.

Trans[0, s] // MatrixForm

Here is the general case.

Trans[α, s] // MatrixForm

These translation matrices form a one-parameter group.

Trans[0, s] . Trans[0, t] // FullSimplify // MatrixForm

Trans[α, s] . Trans[α, t] // FullSimplify // 
      MatrixForm

Again we check for orthogonality.

Transpose[Trans[α, s]] . B . Trans[α, s] // 
        MatrixForm // FullSimplify

Case 3: Horolations about the lightlike point P on the negative y-axis.
          The polar line is the line y+z=0, and the pole of any line through P lies on that line.

HoroPole[r_] := {1, r, -r}

This is a spacelike unit vector.  In the Klein model we would plot the vector {-1/r,1,1}, which represents the same point!

HoroPole[r] . B . HoroPole[r] // Simplify

To make the matrix we apply the reflection in succession to each basis vector and assemble the results into a list. The list makes a matrix from three rows so we must take its transpose.

Ref3[r_] := 
      Transpose[{Reflect[e1, HoroPole[r]], Reflect[e2, HoroPole[r]], 
          Reflect[e3, HoroPole[r]]}]

Ref3[r] // MatrixForm

To make a horolation we perform a product of two reflections. The parameter a that specifies the line for the first reflection is arbitrary.

Horo[h_] := Ref3[a + h] . Ref3[a] // FullSimplify

Horo[h] // MatrixForm

The horolations form a one-parameter group.

Horo[s] . Horo[t] // FullSimplify // MatrixForm

Again we check for orthogonality.

Transpose[Horo[s]] . B . Horo[s] // FullSimplify // 
      MatrixForm

Of course all the reflections have been orthogonal matrices also.

Transpose[Ref3[s]] . B . Ref3[s] // FullSimplify // 
      MatrixForm

The difference shows up in the determinant.

Det[Horo[s]]

Det[Ref3[s]]