Package-level declarations

The projection tier: composite operations built from the products. Projection (project, b ∨ (a ∧ b^☆)) carries a shape onto a higher-grade target; antiprojection (antiproject, b ∧ (a ∨ b^☆)) carries one onto a lower-grade target. Both divide by the target's self-pairing b ∘ b, so the receiver's weight and orientation carry through — an imaginary target (negative self-pairing) negates every component, and a target whose self-pairing vanishes (a line at infinity, a zero-radius circle, coincident endpoints) floods the division instead of throwing. The one bounded target, a Segment, is reached through its carrier's projection and clamped to the segment — no self-pairing of its own.

The project family

PairingResult
RoundPoint project Linethe perpendicular foot, sized by the squared distance
RoundPoint project Circlethe incident round point on the radial line through the point
RoundPoint project Dipolethe carrier point dividing the endpoints in squared-distance ratio
FlatPoint project Linethe perpendicular foot
FlatPoint project Circlethe Dipole where the circle crosses the radial line through the point
FlatPoint project Segmentthe nearest point of the segment itself: the perpendicular foot when it falls within the segment, else the nearer endpoint
Dipole project Linethe Dipole cut from the endpoint circle by the line
Dipole project Circlethe Dipole where the circle meets the orthogonal endpoint circle

A shape already on its target projects to itself. There is deliberately no RoundPoint project FlatPoint: projecting a point onto a point is content-free — the answer is the target's location.

The antiproject family

Antiprojection's inner product is the weight contraction a ∨ b^☆ — the blade-wise negation of the exposed bulk contract — so the compositional spelling b join (a contract b) comes back orientation-flipped relative to the fused forms.

Point targets are one geometric operation with two spellings: the fused forms live on FlatPoint, the representation the algebra keeps non-degenerate, and the RoundPoint overloads forward through toFlat (the raw round-target forms collapse to the target's own weighted point-circle for null lifts). A circle antiprojected onto a point returns a Line, not a circle: every flat-point blade carries e4, so no round weight can come back — the flat limit of carrying the circle's attitude over to the point.

PairingResult
Line antiproject FlatPoint
Line antiproject RoundPoint
the parallel through the point
Circle antiproject FlatPoint
Circle antiproject RoundPoint
the Line through the point perpendicular to its radial
Line antiproject Dipolethe Circle through the endpoints incident with the line's bisector crossing
Circle antiproject Dipolethe Circle through the endpoints paired to the circle

A circle already through the endpoints antiprojects to itself. Dipole and FlatPoint have no antiprojection receivers: their only lower-grade target is a round point, where the operation degenerates.

Degenerate inputs: a line parallel to the dipole's carrier — or a collapsing round weight — throws DegenerateCircleException carrying the straightened line.

Functions

Link copied to clipboard
infix fun Circle.antiproject(dipole: Dipole): Circle

Circle antiproject Dipole => Circle
Returns the circle through the dipole's endpoints incident with this circle's pairing point on their perpendicular bisector.

infix fun Circle.antiproject(flatPoint: FlatPoint): Line

Circle antiproject FlatPoint => Line
Returns the line through the point running the circle's way at the point's bearing — perpendicular to the radial through it.

infix fun Circle.antiproject(point: RoundPoint): Line

Circle antiproject RoundPoint => Line
Returns the line through the point running the circle's way at the point's bearing — perpendicular to the radial through it.

infix fun Line.antiproject(dipole: Dipole): Circle

Line antiproject Dipole => Circle
Returns the circle through the dipole's endpoints incident with the line's crossing of their perpendicular bisector.

infix fun Line.antiproject(flatPoint: FlatPoint): Line

Line antiproject FlatPoint => Line
Returns the parallel to the line through the point.

infix fun Line.antiproject(point: RoundPoint): Line

Line antiproject RoundPoint => Line
Returns the parallel to the line through the point.

Link copied to clipboard
infix fun Dipole.project(circle: Circle): Dipole

Dipole project Circle => Dipole
Returns the dipole where the circle meets the circle through this dipole's endpoints orthogonal to it.

infix fun Dipole.project(line: Line): Dipole

Dipole project Line => Dipole
Returns the dipole where the line cuts the circle through this dipole's endpoints centered on it.

infix fun FlatPoint.project(segment: Segment): FlatPoint

FlatPoint project Segment => FlatPoint
Returns the point of the segment nearest to this point: the perpendicular foot when it falls within the segment, else the nearer endpoint.

infix fun FlatPoint.project(circle: Circle): Dipole

FlatPoint project Circle => Dipole
Returns the dipole where the circle crosses the radial line through the point.

infix fun FlatPoint.project(line: Line): FlatPoint

FlatPoint project Line => FlatPoint
Returns the point's perpendicular foot on the line.

infix fun RoundPoint.project(circle: Circle): RoundPoint

RoundPoint project Circle => RoundPoint
Returns the round point that pairs the point into the circle: on the radial line through the point, incident with the circle.

infix fun RoundPoint.project(dipole: Dipole): RoundPoint

RoundPoint project Dipole => RoundPoint
Returns the point of the dipole's carrier dividing the endpoints in the ratio of their squared distances from the given point.

infix fun RoundPoint.project(line: Line): RoundPoint

RoundPoint project Line => RoundPoint
Returns the point's perpendicular foot on the line, sized by the squared distance to it.