Edisk = Circle((0, 0), 1)
O = (0, 0)

Tool: Klein Disk (command KleinDisk)
Click anywhere to (re)create Klein disk
Input: A
Output: c

c = Circle(A - A, 1)

Tool: Elliptic Line (command Eline1)
Select two points
Input: B, A
Output: e

G = Intersect(LineBisector[B, (1, 0)], LineBisector[B, (-1, 0)])
F = Intersect(LineBisector[B, (0, 1)], LineBisector[B, (0, -1)])
g = Line(F, G)
D = Intersect(LineBisector[A, (1, 0)], LineBisector[A, (-1, 0)])
C = Intersect(LineBisector[A, (0, 1)], LineBisector[A, (0, -1)])
f = Line(C, D)
H = Intersect(f, g)
I = Intersect(Circle[(0, 0), 1], Circle[H, A], 1)
α: acos(cos(Angle[A, H, I]))
β: acos(cos(Angle[B, H, I]))
e = If(α > β, CircumcircleArc[(-I), A, I], CircumcircleArc[I, A, (-I)])

Tool: Elliptic Segment (command ESegment1)
Select two points
Input: B, A
Output: d

G = Intersect(LineBisector[B, (1, 0)], LineBisector[B, (-1, 0)])
F = Intersect(LineBisector[B, (0, 1)], LineBisector[B, (0, -1)])
g = Line(F, G)
D = Intersect(LineBisector[A, (1, 0)], LineBisector[A, (-1, 0)])
C = Intersect(LineBisector[A, (0, 1)], LineBisector[A, (0, -1)])
f = Line(C, D)
H = Intersect(f, g)
d = If(Angle[B, H, A] < Angle[A, H, B], CircleArc[H, B, A], CircleArc[H, A, B])

Tool: Elliptic Distance (command EDistance)
Select two points
Input: A, B
Output: text1

ta: (2 * atan(sqrt(x(A)^(2) + y(A)^(2))))
tb: (2 * atan(sqrt(x(B)^(2) + y(B)^(2))))
pa: atan2(x(A), y(A))
pb: atan2(x(B), y(B))
dab: acos((cos(ta) * cos(tb)) + ((sin(ta) * sin(tb)) * cos(pa - pb)))
text1: "" + dab + " in"

Tool: Elliptic Circle with Center through Point (command ECircleCP)
Select center and point
Input: A, B
Output: c0

ta: (2 * atan(sqrt(x(A)^(2) + y(A)^(2))))
tb: (2 * atan(sqrt(x(B)^(2) + y(B)^(2))))
pa: atan2(x(A), y(A))
pb: atan2(x(B), y(B))
dab: acos((cos(ta) * cos(tb)) + ((sin(ta) * sin(tb)) * cos(pa - pb)))
C1: (tan((ta + dab) / 2) / tan(ta / 2) * A)
C2: (tan((ta - dab) / 2) / tan(ta / 2) * A)
C0 = Midpoint(C1, C2)
c0 = Circle(C0, C2)

Tool: Elliptic Compass (command EllipticCompass)
Select two points and new center
Input: E, A, B
Output: e0

te: (2 * atan(sqrt(x(E)^(2) + y(E)^(2))))
pb: atan2(x(B), y(B))
tb: (2 * atan(sqrt(x(B)^(2) + y(B)^(2))))
pa: atan2(x(A), y(A))
ta: (2 * atan(sqrt(x(A)^(2) + y(A)^(2))))
dab: acos((cos(ta) * cos(tb)) + ((sin(ta) * sin(tb)) * cos(pa - pb)))
E2: (tan((te - dab) / 2) / tan(te / 2) * E)
E1: (tan((te + dab) / 2) / tan(te / 2) * E)
E0 = Midpoint(E1, E2)
e0 = Circle(E0, E2)

Tool: MySlope
MySlope[ <Point>, <Point> ]
Input: A, B
Output: ma

d: (2 * ((x(A) * y(B)) - (x(B) * y(A))))
ra: x(A)^(2) + y(A)^(2) - 1
rb: x(B)^(2) + y(B)^(2) - 1
K: ((ra * y(B)) - (rb * y(A)), ((-ra) * x(B)) + (rb * x(A))) / d
ma: ((-(x(A) - x(K)))) / (y(A) - y(K))

Tool: Elliptic Angle (command EAngle)
Select three points
Input: D, E, F
Output: α3

a = MySlope(E, F)
b = MySlope(E, D)
aa = If(EDistance[E + (0.1 * (1, a) / sqrt(1 + a^(2))), F] < EDistance[E, F], (1, a), (-1, (-a)))
bb = If(EDistance[E + (0.1 * (1, b) / sqrt(1 + b^(2))), D] < EDistance[E, D], (1, b), (-1, (-b)))
α2: (acos((aa * bb / ((sqrt(1 + a^(2)) * sqrt(1 + b^(2)))))) * 180 / π)
α3: "" + α2 + "°"