By dkl9, written 2025-224, revised 2025-224 (0 revisions)
Angles in general are 2D rotations are points on the unit circle are naturally described by coordinates (x, y) with x² + y² = 1. Circles bend into 2D from a 1D essence, so it should take only one number to name any point along them. Usually, we describe angles as numbers from 0 to τ, which we convert to and from coordinate form with trigonometric functions. But trigonometry is transcendental, i.e. messy to compute. Less trivially, the bounded range of trigonometric angles means that numbers outside that range just repeat angles already expressed, infinitely many times. We can do better.
Pick a reference point on the unit circle. Traditionally, that would be (1, 0); I use (0, -1) here. Pick the line that bisects the circle, at right angles to the vector from centre to reference point. Here, that's the x-axis.
Draw lines from the reference point's antipode — here, (0, 1) — out thru the circle and its chosen bisector. Those lines match points (p, 0) on the bisector to points (x, y) on the circle. The mapping is bijective, except at the antipode. Points on the circle become angles when compared to a reference point, so this is a continuous bijection between most angles and the full real line.
This mapping is already studied as the stereographic projection for S¹, but I've yet to see it treated as a form of angle.
The cardinal directions left, down, and right respectively have projective angles -1, 0, and 1. Angles on the left are the negatives of matching angles on the right; negate x and you negate p. Angles on the top half are the reciprocals of matching angles on the bottom; negate y and you reciprocate p. Thus the straight angle, at the point (0, 1), takes projective angle 1/0 = ±∞. A strictly positive infinity approaches as (ε, 1), while a strictly negative infinity approaches as (-ε, 1).
An angle-point (x0, y0) corresponds to a projective angle at the x-intercept of the line thru that point and (0, 1). By slope-intercept form, that line is y = (y0 - 1) x / x0 + 1. Solve at (x, y) = (p, 0) and we find p = x0 / (1 - y0).
From that equation and that of the circle, x² + y² = 1, after much elided algebra, we find (x, y) = (2 p, p² - 1) / (p² + 1).
Unlike with trigonometric angles, it only takes basic arithmetic operations to convert between projective angles and points on the circle.
Projective angles are at best only roughly linear to arclength, only in a small range near the reference point. To add projective angles is more complicated than the trivial α + β of trigonometric angles, but still simple enough, using only basic arithmetic: p ⊕ q = (p + q) / (1 - p·q). That formula resembles the angle addition identity for tangent, and can be proven by appeal thereto, much as it disgusts me to rely on trigonometry.
All formulae given here thru angle addition are shown at https://desmos.com/calculator/projective.
A double-angle formula arises from the angle addition formula: 2 ⊗ p = p ⊕ p = (p + p) / (1 - p·p) = (2 p) / (1 - p²). A half-angle formula is the inverse of that: 1/2 ⊗ p = (sqrt(p² + 1) - 1) / p. Square roots are messier than pure arithmetic, but trigonometry is hardly better: to get coordinates for a halved angle, you have to use square roots anyway or recompute transcendental functions.
You might hope that you could easily generalise those formulae to multiply angles, like in n ⊗ p = (n·p) / (1 - pn). Alas, this doesn't work. A correct formula for integer n comes by repeated application of the angle addition formula, which cannot be so simplified. A correct formula for all n works based on transcendental tangent and arctangent, succumbing to the nigh-inescapable hegemony of trigonometric angles: n ⊗ p = tan(n arctan(p)). That formula is too ugly and depressing to deserve a proof.
We can wriggle free of this transcendental hell, if we treat n as a dyadic rational to guide how we add power-of-two "multiples" of p. To scale p by a power of two, repeatedly double or halve it by the pure-arithmetic formulae above
Polar coordinates describe points in 2D by a radius r ∈ [0, ∞) and an angle θ ∈ [0, τ). Any point has countably infinite equivalent polar coordinates, if you offset θ by a multiple of τ.
Projective polar coordinates address that redundancy. Keep the radius r ∈ [0, ∞), and in place of θ, use p ∈ [-∞, ∞].
From rectangular coordinates (x, y), you get r = sqrt(x² + y²) and p = x / (r - y). From projective coordinates (r, p), you get (x, y) = (2 p, p² - 1)·r / (p² + 1). As with just projective angles, all these operations are mere arithmetic, except the square root to get r.
If, in place of r, you use log r ∈ (-∞, ∞) with p ∈ (-∞, ∞), projective coordinates give a bijection from the 2D plane, treated as rectangular, to a slit plane that omits (0, 0) to (0, ∞), treated as concentric circles.