# GeoGebra Constructions in the Poincaré Disc

The Poincaré disc is the interior of a circle. When doing hyperbolic geometry using the Poincaré disc model, all points are on the Poincaré disc, i.e. they are inside a circle. Since infinity is at the circle, let's call it the circle at infinity, \(C_\infty \). A geodesic through two points is an arc through the points that is perpendicular to \(C_\infty \). If two points are on a diameter of \(C_\infty \), that diameter is the geodesic through the points. A geodesic is the hyperbolic version of a line in Euclidean geometry. Two hyperbolic lines (geodesics) that do not intersect, are parallel. Given a hyperbolic line and a point not on it, there are infinitely many hyperbolic lines through the point that are parallel to the given hyperbolic line.

When doing hyperbolic geometry using the Poincaré disc model, angles are measured the same way as in Euclidean geometry, but distances are not.
An angle between two geodesics that intersect, is measured as the angle between the tangent lines at the intersection point.
The Euclidean length of an arc however, does **not** correspond to the hyperbolic length. A geodesic has a finite Euclidean
arc length, but it is an infinitely long hyperbolic line. To make it easy, the unit circle centered at the
origin will be used as \(C_\infty \) in all constructions.

In the static case, where the points do not move, it is fairly easy to make hyperbolic constructions. In the dynamic case however, the constructions should pass the dragging test. For that reason it is often necessary to use the GeoGebra If-command and the GeoGebra IsDefined-command.

The basic construction used when constructing geodesics is inversion in circle. Some of the properties discussed on the previous page is summarized here.

## Properties of circle inversion

Let \(C_\infty\) be the circle defining the Poincaré disc and let \(O\) be its center.

- A circle \(c\) through a point \(A\) is perpendicular to \(C_\infty\) if and only if the inverted point \(A'\) lies on \(c\).
- Let \(M\) be the midpoint of \(A\) and \(A'\). A circle through \(A\) having \(M\) as its centre is perpendicular both to \(C_\infty\) and to the ray through \(O\) and \(A\).
- Let \(A\) and \(B\) be points on the Poincaré disc and let the points \(P\) and \(Q\) be the endpoints of the geodesic through \(A\) and \(B\). Then the hyperbolic distance \(d(A,B)\) between \(A\) and \(B\) is defined by \[ d(A,B) = |\ln(A,B; P,Q)|=\left|\ln\left(\frac{AP \cdot BQ}{BP \cdot AQ}\right)\right| \]
- Circle inversion in a geodesic preserves angles and hyperbolic distances.

## Construct a hyperbolic line

Let \(A\) and \(B\) be points in the Poincaré disc and let the points \(A'\) and \(B'\) be their inverse points in \(C_\infty\). We need a circle through \(A\) and \(B\) that is perpendicular to \(C_\infty \).

When constructing a geodesic through A and B, any of the reflected points A' or B' can be used to define a circle. If one of the points has coordinates (0,0), use the other point. (The origin is reflected to infinity which, in this context, is an undefined point.)

To construct a geodesic through points \(A\) and \(B\):

- Construct the reflected point A':
`Reflect[A,Circle[(0,0), 1]]`

- Construct the reflected point B':
`Reflect[B,Circle[(0,0), 1]]`

- Create a circle c_1 through the points A and B, and one of the reflected points:

`c_1 = If[A==(0,0), Circle[A, B, B'], Circle[A, A', B]]`

If A is the origin, the three defining points are collinear, and a line is constructed. - Make the intersection points between c_1 and the unit circle:
`Intersect[c_1,Circle[(0,0), 1]]`

Rename the intersection points to P and Q. - Use the tool
`Circumcircular Arc through Three Points`

on P, A, and Q; to construct the hyperbolic line hline.

Hide the label hline. - Create a tool HypLine (hyperbolic line) that has hline as an output object and A, B as input objects.

If a unit circle is created and then used when constructing the geodesic, it is not possible to make a GeoGebra tool without using the unit circle as input object. For that reason all constructions using the unit circle should be entered in the input bar.

## Construct a hyperbolic segment

A hyperbolic segment between \(A\) and \(B\) is the arc along the geodesic through \(A\) and \(B\). If either \(A\) or \(B\) is
the origin, the hyperbolic segment is the Euclidean segment between \(A\) and \(B\). The tool
`Circumcircular Arc through Three Points`

must be used since there might not be a centre point of the circle. A third point
is needed in order to define the arc. Let hline be the geodesic between \(A\) and \(B\), and make the construction:

- Construct a ray r_1 from the origin:
`r_1 = Ray[(0,0), Midpoint[A,B]]`

- Construct the intersection point I_1 between r_1 and the hyperbolic line hline

(if A, B and the origin are collinear, I_1 is not defined). - Make a point I_2:
`I_2 = If[IsDefined[I_1], I_1, Midpoint[A, B]]`

- Make a circumcircular arc hseg through A, I_2 and B. Hide the label hseg.
- Create a tool HypSegment that has hseg as an output object and A, B as input objects.

## Construct a hyperbolic ray

When constructing a ray through \(A\) and \(B\), with \(A\) as a starting point, we cannot use the previously constructed endpoints
of the geodesic, the points \(P\) and \(Q\). Intersection points between circles don't have any particular orientation.
Depending on the position of \(A\) and \(B\), we either need `CircumCircularArc[A, B, P]`

or
`CircumCircularArc[A, B, Q]`

. Instead of using \(P\) or \(Q\), start by making an arc that is guaranteed
to have \(A\) as one endpoint and the other endpoint outside of \(C_\infty\). If \(B\) is not equal to \(O\), the
inverted point \(B'\) will do. Otherwise \(A\) and \(B\) lies on a diameter, by reflecting the inverted point \(A'\) in
\(O\) we get a point that will do.

When GeoGebra makes an intersection with an arc, two points are created but only one is seen. In order for the construction to be dynamic, and always work, both intersection points must be considered.

- Reflect A' in the origin to a point A'':
`A''=Reflect[A', (0,0)]`

- Make the first arc a_1:
`a_1 = CircumcircularArc[A, B, If[IsDefined[B'], B', A'']]`

- Make the first intersection point I_3:
`I_3 = Intersect[a_1, Circle[(0, 0), 1], 1]`

- Make the second intersection point I_4:
`I_4 = Intersect[a_1, Circle[(0, 0), 1], 2]`

Move the points around, either I_3 or I_4 will always be defined. - Make the final arc hray:
`hray = CircumcircularArc[A, B, If[IsDefined[I_3], I_3, I_4]]`

Hide the label hray.

- Create a tool HypRay that has hray as an output object and A, B as input objects.

## Construct the hyperbolic distance between two points

Make four distances and then use the hyperbolic distance formula on them

`ap = Distance[A, P]`

`aq = Distance[A, Q]`

`bp = Distance[B, P]`

`bq = Distance[B, Q]`

- Make the distance dist:
`dist = abs(ln(ap bq / (bp aq)))`

- Create a tool HypDistance that has dist as an output object and A, B as input objects.

## Construct a hyperbolic circle

It can be shown that hyperbolic circles in the Poincaré disc have the same form as Euclidean circles, but not the same centre. To construct a circle through \(B\) that has a point \(A\) as its hyperbolic centre, we need to find the centre of the corresponding Euclidean circle. All hyperbolic lines through the hyperbolic centre, must be perpendicular to the circle. One such line is the geodesic through \(A\) and \(O\). If \(B\) is not collinear with \(A\) and \(O\), construct the line through \(B\) that is tangent to the geodesic through \(A\) and \(B\). The intersection of the tangent line and the line through \(A\) and \(O\), is the Euclidean centre.

- Make a line l_1 through A and O:
`l_1 = Line[A, (0, 0)]`

- Use the tool
`Tangents`

on B and the geodesic hline, to construct a line l_2. - Find the intersection I_5 between l_1 and l_2.

When \(B\) is collinear to \(A\) and \(O\), the point \(I_5\) is undefined. In this case we need another way to find the Euclidean centre. This is where the hyperbolic distance is needed.

Assume that \(A, B\) and \(O\) are collinear, and let the endpoints of the geodesic through \(A\) and \(B\) be \(P\) and \(Q\).

Let \(c\) be the circle through \(A\) that has the midpoint \(M\) between \(A\) and \(A'\) as its centre. \(c\) is perpendicular to \(C_\infty \) and to the line \(b\) through \(A\) and \(O\). Reflect \(B\) in circle \(c\) to a point \(B'\). The endpoints \(P\) and \(Q\) to the geodesic through \(A\) and \(B\), are also the endpoints to the geodesic through \(A\) and \(B'\). Since the cross ratio is preserved when reflecting in a circle, we have that \(d(A,B) = d(A, B')\). Hence, the midpoint between \(B\) and \(B'\) is the Euclidean centre. In GeoGebra, do this:

- Make the circle c_2:
`c_2 = Circle[Midpoint[A, A'], A]`

- Reflect B in c_2 and rename the resulting point to B''.
- Make a point:
`Mid = If[IsDefined[I_5], I_5, Midpoint[B,B'']]`

- Make the hyperbolic circle hcircle:
`hcircle = If[A == (0,0), Circle[(0, 0), B], Circle[Mid, B]]`

Hide the label hcircle. - Create a tool HypCircle that has hcircle as an output object and A, B as input objects.

## Construct a hyperbolic perpendicular bisector

This construction is exactly like the Euclidean ruler-and-compass-construction, but a hyperbolic line is used as ruler, and a hyperbolic circle as compass.

- Make two points A and B.
- Use the tool
`HypCircle`

two times, on A then B, on B then A. - Make the intersection points I_6 and I_7 between the two hyperbolic circles.
- Use the tool
`HypLine`

on I_6 and I_7 to make a geodesic hperpbisector.

Hide the label hperpbisector. - Create a tool HypPerpendicularBisector that has hperpbisector as an output object and A, B as input objects.

## Construct a hyperbolic midpoint

The hyperbolic midpoint \(M\) between two points \(A\) and \(B\), is the intersection between the hyperbolic line through \(A\) and \(B\) and the hyperbolic perpendicular bisector. When GeoGebra makes an intersection point between two arcs, it handles it like an intersection between circles, where only one of the two intersection points is a valid intersection between the arcs. When making a construction, you want to be able to drag the points afterwards, and sometimes when you do, the intersection point will be undefined. To make a tool that always works, do this in GeoGebra:

- Make two points \(A\) and \(B\).
- Use the tool
`HypLine`

on \(A\) and \(B\) to make a geodesic hline (or use a hyperbolic segment). - Use the tool
`HypPerpendicularBisector`

on \(A\) and \(B\) to make a geodesic hperpbisector. - Make the first intersection point I_8:
`I_8 = Intersect[hline, hperpbisector, 1]`

- Make the second intersection point I_9:
`I_9 = Intersect[hline, hperpbisector, 2]`

- Make the intersection point Hmidpoint as:
`Hmidpoint = If[IsDefined[I_8], I_8, I_9]`

- Create a tool HypMidpoint that has Hmidpoint as an output object and A, B as input objects.

## Construct a hyperbolic perpendicular line

Given a point and a hyperbolic line, it is possible to construct a hyperbolic line through the point that is perpendicular to the given line.
Just as the Euclidean GeoGebra tool `Perpendicular Line`

. The tool must have two points as input objects though, it's not possible
to use just a geodesic as input object, since the geodesic depends on the defining points.

- Make two points A and B and the hyperbolic line hline through the points.
- Make a third point C.
- Use the tool
`HypCircle`

on C and then A to create the circle c_3. - Make the intersection points J_1 and J_2 between hline and c_3.
- Use the tool
`HypPerpendicularBisector`

on J_1 and J_2 to make a geodesic hperpline.

Hide the label hperpline. - Create a tool HypPerpendicularLine that has hperpline as an output object and C, A, B as input objects.

## Construct a hyperbolic angle bisector

The hyperbolic bisector is constructed in a similar way as in the Euclidean case.

- Make three points A, B, C.
- Use the tool
`HypRay`

on A and B to make a ray hray. - Use the tool
`HypRay`

on A and C to make a ray hray2. - Use the tool
`HypCircle`

on A and B to make a circle hcircle. - Make the first intersection point J_3:
`J_3 = Intersect[hcircle, hray2, 1]`

- Make the second intersection point J_4:
`J_4 = Intersect[hcircle, hray2, 2]`

- Make a point J_5 that is always defined:
`J_5 = If[IsDefined[J_3], J_3, J_4]`

- Use
`HypCircle`

on J_5 then A to make a circle c_4. - Use
`HypCircle`

on B then A to make a circle c_5. - Make the intersection points J_6 and J_7 between c_4 and c_5:
- Use
`HypLine`

on J_6 and J_7 to create geodesic hanglebisector.

Hide the label hanglebisector. - Create a tool HypAngleBisector that has hanglebisector as an output object and B, A, C as input objects.

## Hyperbolic reflection

No construction is needed. The tool `Reflect Object in Circle`

can be used.

## Construct a hyperbolic compass

The GeoGebra tool `Compasses`

makes a copy of a circle that can then be moved anywhere. To make a hyperbolic version,
Let the points \(A\) and \(B\) define the hyperbolic circle to be copied, where \(A\) is the centre of the circle. Let \(C\)
be the position of the new centre point.

- Make three points A, B, C.
- Use the tool
`HypPerpendicularBisector`

on A and C to make a geodesic c. - The inversion of A in c is C. If B also is inverted in c to a point B_1, then \(d(A,B)=d(C,B')\).

Hence, reflect B in c to a point B_1! - Use the tool
`HypCircle`

on C and B_1 to create circle hcompass.

Hide the label hcompass. - Create a tool HypCompass that has hcompass as an output object and A, B, C as input objects.

## Construct a hyperbolic rotate tool

The GeoGebra-tool `Rotate Object around Point by Angle`

doesn't really rotate an object but creates a
copy of an object that is rotated relative to original object. We can make a hyperbolic version of the
rotate-tool that creates a geodesic that is rotated around a point.

- Make two points A and B and the inverted points A' and B':

`Reflect[A, Circle[(0, 0), 1]]`

`Reflect[B, Circle[(0, 0), 1]]`

- Use the tool
`HypLine`

on A and B to create a hyperbolic line hline. - Make the centre M of hline:
`M = Centre[hline]`

- Make a line a through A and M.
- Make a slider
`α`measuring angles. - Rotate a to a' around A:
`a' = Rotate[a, α, A]`

- Make the perpendicular bisector b between A and A':
`b = PerpendicularBisector[A, A']`

- Make the intersection D between b and a'.
- Make the circle d through D and A:
`d = Circle[D, A]`

- Make the intersection points between D and the unit circle:
`Intersect[d, Circle[(0, 0), 1]]`

Rename the intersection points to K_1 and K_2. - Make a circumcircular arc through K_1, A, and K_2, call it hrotate.

Hide the label hrotate. - Create a tool HypRotate that has hrotate as output object and B,
`α`, A as input objects.

# references:

Chaim Goodman Strauss - Compass and Straightedge in the Poincaré disk (pdf)

G. Eric Moorhouse - Foundations of Geometry, Inversive Plane Geometry (pdf)

Kenji Kozai & Shlomo Libeskind - Circle Inversions and Applications to Euclidean Geometry (pdf)

Marvin Jay Greenberg - Euclidean and Non-Euclidean Geometries, Development and History

by Malin Christersson under a Creative Commons Attribution-Noncommercial-Share Alike 2.5 Sweden License