join
FlatPoint join FlatPoint => Line
Returns the line through both points, oriented so its normal points to the left of the travel from this point to other.
The projective cross product of the two (px, py, pz) triples. The strict CGA wedge of two flat points is zero — both carry a factor of e4 — so this is the family's one non-blade pairing, ported from the RGA join because the line through the two points is what joining them means. Joining a finite point with a direction (at infinity) gives the line through the point running along it. Coincident points collapse to the all-zero line, which the Line constructor accepts.
Receiver
The first point.
Return
The raw Line through both points; all-zero when they coincide.
Parameters
The second point.
FlatPoint join RoundPoint => Line
Returns the line through the flat point and the round point.
A strict wedge. The pairing produces no e321 component — every flat-point blade carries e4 — so a flat and a round point always join into a line, never a circle. The normal points to the left of the travel from the flat point to the round point, in either operand order. An operand at infinity gives the line through the finite operand running along the carried direction; coincident operands collapse to the all-zero line, which the Line constructor accepts.
Receiver
The flat point.
Return
The raw Line through both operands; all-zero when they coincide.
Parameters
The round point.
RoundPoint join FlatPoint => Line
Returns the line through both points.
FlatPoint join RoundPoint with the operands swapped. The swap is exact: the grade-1·grade-2 wedge parity is even, so both orders build the identical Line, orientation included — the normal sits to the left of the flat→round travel in either spelling.
Receiver
The round point.
Return
The raw Line through both operands.
Parameters
The flat point.
RoundPoint join RoundPoint => Dipole
Returns the dipole holding both points — this point as Dipole.start, other as Dipole.end.
A strict wedge. The operand order is the dipole's orientation: start join end rebuilds it exactly, and swapping the operands negates every component. At-infinity operands join into an at-infinity dipole, kept raw — gate with Dipole.isAtInfinity — unless their directions are parallel: then the wedge collapses just as coincident points do, and the unitizing Dipole constructor throws.
Receiver
The first point, the result's Dipole.start.
Return
The raw Dipole with both points.
Parameters
The second point, the result's Dipole.end.
Throws
When the wedge collapses at the SCALE quantum — the points coincide, or two at-infinity operands carry parallel directions.
RoundPoint join Dipole => Circle
Returns the circle through the point and the dipole's endpoints.
Dipole join RoundPoint with the operands swapped. The swap is exact: the grade-1·grade-2 wedge parity is even, so both orders build the identical Circle, orientation included.
Receiver
The point off the dipole.
Return
The raw Circle through the point and the dipole's endpoints.
Parameters
The dipole contributing its endpoints.
Throws
When this point lies on the dipole's carrier at the SCALE quantum; carries the Line through the collinear points.
RoundPoint join Segment => Circle
Returns the circle through the segment's endpoints and this point.
Segment join RoundPoint with the operands swapped. The swap is exact: the underlying grade-1·grade-2 wedge parity is even, so both orders build the identical Circle, orientation included.
Receiver
The point off the segment.
Return
The raw Circle through the segment's endpoints and this point.
Parameters
The segment contributing its endpoints.
Throws
When this point is collinear with the segment at the SCALE quantum; carries the Line through the collinear points.
Dipole join RoundPoint => Circle
Returns the circle through the dipole's endpoints and point.
A strict wedge. For a finite real dipole the walk Dipole.start → Dipole.end → point decides the orientation: a counterclockwise turn builds a classic circle, a clockwise turn an inside-out one. A point on the dipole's carrier collapses the round weight — three collinear points trace a line, not a circle — and the unitizing Circle constructor throws, carrying that line.
Receiver
The dipole contributing its endpoints.
Return
Parameters
The point off the dipole.
Throws
Segment join RoundPoint => Circle
Returns the circle through the segment's endpoints and point.
Delegates to Dipole join RoundPoint via Segment.toDipole — a circle through a segment's endpoints plus a third point is just a circle, so the composite form changes nothing; it keeps Segment first-class at call sites. Orientation and degeneracy follow the dipole form.
Receiver
The segment contributing its endpoints.
Return
Parameters
The point off the segment.