Try Astrologer API

Subscribe to support and grow the project.

Midpoint Factory #

The MidpointFactory computes the midpoint of every unordered pair of active points in a chart. Midpoints are central to cosmobiology (Ebertin) and Uranian/Hamburg-school astrology, where they are treated as sensitive axes: when a third point crosses one, the energies of the defining pair are activated.

What It Computes #

  • The midpoint of every pair of active points (shorter arc convention)
  • The 90-degree modulus position for cosmobiology dial work
  • Optional aspect activations: which third points form aspects with each midpoint

Basic Usage #

from kerykeion import AstrologicalSubjectFactory, MidpointFactory

subject = AstrologicalSubjectFactory.from_birth_data(
    "John", 1990, 6, 15, 14, 30,
    lng=12.5, lat=41.9, tz_str="Europe/Rome", online=False,
)

midpoints = MidpointFactory.compute(subject)

for m in midpoints:
    print(f"{m.point_a}/{m.point_b}: {m.midpoint_position:.2f} {m.midpoint_sign}"
          f" (90 dial: {m.midpoint_modulus_90:.2f})")
    for a in m.aspects_to_midpoint:
        print(f"   activated by {a.point_name} ({a.aspect}, orb {a.orb:.2f})")

Methods #

compute(subject, *, active_points, compute_aspects, aspect_orb, aspects) #

Compute every pairwise midpoint and (optionally) aspect activations.

Parameter Type Default Description
subject AstrologicalSubjectModel The natal/event chart to analyse
active_points Sequence[str] or None None Points to use as midpoint constituents. Defaults to DEFAULT_PREDICTIVE_POINTS: Sun through Pluto, True North Lunar Node, Chiron, Ascendant and Medium Coeli. Names the subject does not carry are skipped, and fewer than two resolved points give an empty list
compute_aspects bool True Also compute third-point aspect activations
aspect_orb float 1.0 Orb in degrees for aspect-to-midpoint detection
aspects Sequence[str] or None None Whitelist of aspect names (defaults to all configured)

Returns: List[MidpointModel]

compute_active_midpoint_points(subject, pair_names) #

Materialize midpoints as KerykeionPointModel entries so the chart drawer can render them like ordinary active points.

Parameter Type Description
subject AstrologicalSubjectModel The natal subject
pair_names Sequence[str] Pair identifiers in "A_B" form (e.g. "Sun_Moon")

Returns: List[KerykeionPointModel], one per resolved pair, named "A_B_Midpoint" with point_type="Midpoint" and sign, element, quality and house derived from the midpoint longitude on the shorter arc. Both sides of a pair must resolve in the subject’s own active_points: a pair that does not is skipped and logged as a warning. A repeated pair, or the reversed "B_A" twin of one already emitted, is skipped too — the first occurrence wins.

Data Models #

MidpointModel #

Field Type Description
point_a str Name of the first point
point_b str Name of the second point
point_a_abs_pos float Absolute longitude of point A (0-360)
point_b_abs_pos float Absolute longitude of point B (0-360)
midpoint_abs_pos float Midpoint longitude on the shorter arc (0-360)
midpoint_sign str Three-letter zodiac sign code (Ari, Tau, …)
midpoint_position float Position within the sign in degrees (0-30)
midpoint_modulus_90 float 90-degree dial position (longitude % 90)
aspects_to_midpoint List[MidpointAspectModel] Third points that aspect this midpoint

MidpointAspectModel #

Field Type Description
point_name str Name of the third point that aspects the midpoint
point_abs_pos float Absolute zodiacal longitude of the third point
aspect str Aspect name (conjunction, trine, square, …)
aspect_degrees int Exact aspect angle in degrees
orb float Orb (deviation from exact aspect) in degrees

90-Degree Dial #

The midpoint_modulus_90 field converts the midpoint longitude to the 90-degree dial used in cosmobiology. This reduces the full 360-degree circle to a 90-degree range, making it easier to spot hard aspects (conjunction, square, opposition) as conjunctions on the dial.