Натальная карта

Аспекты

Каталог аспектов, системы орбисов, конфигурации, гармоники, мидпойнты, склонения.

68 мин чтения 2 122 строк · docs/04-aspekty/00-aspekty-polnyy-spravochnik.md
Содержание

Технический референс для реализации астрологического движка. Все формулы даны в виде, пригодном для прямого кодирования. Углы — в градусах, если не указано иное.


1. ОПРЕДЕЛЕНИЕ АСПЕКТА И БАЗОВАЯ МАТЕМАТИКА

1.1. Что такое аспект

Аспект (aspect, аспект) — угловое расстояние между двумя точками, измеренное по эклиптике (ecliptic longitude, эклиптическая долгота λ), которое соответствует одному из выделенных «гармонических» углов.

Ключевые уточнения:

  • Аспект по умолчанию считается по долготе, то есть это проекция на плоскость эклиптики. Реальное угловое расстояние в пространстве (с учётом широты β) обычно игнорируется. Это называется аспект в долготе (aspect in longitude).
  • Существует альтернатива — истинное угловое расстояние (true/mundane angular separation) с учётом широты, см. §1.8.
  • Аспекты по склонению (параллели) — отдельный класс, см. §8.

1.2. Угловое расстояние с учётом «заворота» (wraparound)

Долготы живут на окружности, поэтому простая разность неверна. Каноническая формула:

Δ_signed = (λ₂ − λ₁) mod 360          // 0 ≤ Δ_signed < 360

Нормализация в диапазон 0…180 (ненаправленное расстояние):

separation(λ₁, λ₂):
    d = (λ₂ − λ₁) mod 360
    if d > 180:
        d = 360 − d
    return d                          // 0 ≤ d ≤ 180

Нормализация в диапазон −180…+180 (направленное, со знаком):

signed_diff(λ₁, λ₂):
    d = (λ₂ − λ₁ + 180) mod 360 − 180
    return d                          // −180 < d ≤ 180

Замечание об операции mod в разных языках: в C/C++/Java/JavaScript оператор % возвращает отрицательный результат для отрицательного делимого. Обязательна «математическая» функция:

norm360(x):
    r = fmod(x, 360.0)
    if r < 0: r += 360.0
    return r

В Python % уже возвращает неотрицательный результат — дополнительная обёртка не нужна.

1.3. Проверка наличия аспекта

Пусть A — идеальный угол аспекта (exact aspect angle), orb_max — допустимый орбис.

d = separation(λ₁, λ₂)
delta = |d − A|                       // отклонение от точности (orb, орб)
is_aspect = (delta ≤ orb_max)

delta называется фактическим орбисом (actual orb, «орб аспекта»), orb_max — допустимым орбисом (allowed orb, орбис). В русскоязычной традиции оба часто называются «орбис», что порождает путаницу; в коде стоит разделять orb_actual и orb_limit.

1.4. Орбис (orb, орбис)

Орбис — допустимое отклонение от точного угла, при котором аспект считается действующим.

Две принципиально разные парадигмы:

  1. Современная (modern): орбис приписывается аспекту (соединение 8°, тригон 7° и т.д.), иногда с поправкой на светила. См. §3.2–3.4.
  2. Традиционная (traditional): орбиса аспекта не существует вовсе. Орбис приписывается планете — это её «сфера лучей» (orb of light, orbis). Для двух планет действует мойети (moiety, половина орбиса):
orb_limit(P₁, P₂) = (orb(P₁) + orb(P₂)) / 2
                  = moiety(P₁) + moiety(P₂)

где moiety(P) = orb(P)/2. См. §3.1.

1.5. Аппликация и сепарация (applying / separating)

Аппликация (applying, аспект в аппликации) — планеты сближаются к точному аспекту; аспект «строится», его действие нарастает, событие впереди. Сепарация (separating, аспект в сепарации) — планеты расходятся от точного аспекта; действие убывает, событие в прошлом.

Метод 1 — через производную расстояния (наиболее надёжный)

Пусть v₁, v₂ — суточные движения (daily motion, °/сутки) планет, со знаком: ретроградность = отрицательная скорость.

applying_or_separating(λ₁, v₁, λ₂, v₂, A):
    d0 = separation(λ₁, λ₂)
    delta0 = |d0 − A|
    // положение через малый шаг времени h (например, h = 0.01 суток)
    d1 = separation(λ₁ + v₁*h, λ₂ + v₂*h)
    delta1 = |d1 − A|
    if delta1 < delta0: return APPLYING
    if delta1 > delta0: return SEPARATING
    return EXACT / PARALLEL_MOTION

Это численно устойчиво и автоматически корректно обрабатывает ретроградность, заворот через 0°/360° и «разворот» аспекта через 180°.

Метод 2 — аналитический (классический)

Работает через относительную скорость и знак отклонения.

relative_speed = v₂ − v₁              // скорость «догоняющей» конфигурации
d_signed = signed_diff(λ₁, λ₂)        // −180..+180

// целевые значения знакового расстояния для аспекта A: +A и −A
target = (|d_signed − A| < |d_signed + A|) ? +A : −A
error  = d_signed − target            // насколько мы «мимо»

// если error и relative_speed имеют разные знаки — сближаемся
if error * relative_speed < 0: APPLYING
else: SEPARATING

Метод 3 — традиционный (только для быстрых/медленных)

В классической традиции: быстрая планета аппликует к медленной. Если более быстрая планета (по абсолютной величине суточного движения) находится позади точки аспекта и движется к ней директно — аппликация.

faster = (|v₁| > |v₂|) ? P₁ : P₂

Особые случаи традиции:

  • Refranation (рефранация) — быстрая планета разворачивается (становится ретроградной) до завершения аспекта; аспект не совершается.
  • Prohibition / frustration (запрещение, фрустрация) — третья планета вклинивается и совершает аспект раньше.
  • Collection of light (собирание света) — обе планеты аппликуют к третьей, более медленной.
  • Translation of light (перенос света) — быстрая планета сепарирует от одной и аппликует к другой.

Время до точного аспекта

time_to_exact = error / (−relative_speed)    // в сутках, при линейном приближении

Для точного результата (учёт переменной скорости, стационарных точек) нужен итеративный метод — бисекция или Ньютона–Рафсона по функции f(t) = separation(λ₁(t), λ₂(t)) − A:

find_exact_time(t0, t1):
    // бисекция на интервале, где f меняет знак
    while (t1 − t0) > tolerance:
        tm = (t0 + t1)/2
        if sign(f(tm)) == sign(f(t0)): t0 = tm
        else: t1 = tm
    return (t0+t1)/2

1.6. Партильные и платические аспекты

ТерминЛатыньОпределениеПорог
Партильный (партиль)partileОбе планеты в одном и том же градусе (целочисленном), либо орб < 1°delta < 1.0° (или floor(λ₁) == floor(λ₂ ∓ A))
ПлатическийplaticВ пределах орбиса, но не партильный1.0° ≤ delta ≤ orb_limit
Точныйexact / partile to the minuteОрб близок к нулюdelta < 0.0167° (1 угловая минута)

Строгое классическое определение партиля — совпадение градуса: Марс в 14°32′ Овна и Венера в 14°08′ Льва — партильный тригон, потому что оба в 14-м градусе. Современное упрощение — просто delta < 1°.

Dexter / Sinister (правый / левый аспект):

  • Sinister (левый) — аспект отбрасывается вперёд по знакам зодиака (в направлении возрастания долготы).
  • Dexter (правый) — аспект отбрасывается назад. Традиционно считается более сильным.
d_signed = signed_diff(λ₁, λ₂)
// аспект от P₁ к P₂:
if d_signed > 0: SINISTER    // P₂ впереди P₁
else:            DEXTER

1.7. Функция точности / силы (exactness / strength)

Базовая нормированная точность:

exactness = 1 − (delta / orb_limit)        // 1.0 в точке, 0.0 на краю орбиса

Развёрнутые варианты — см. §7.

1.8. Истинное угловое расстояние (с учётом широты)

Если нужна не проекция, а реальный угол между направлениями на два тела:

cos(θ) = sin(β₁)·sin(β₂) + cos(β₁)·cos(β₂)·cos(λ₁ − λ₂)
θ = acos(clamp(cos_θ, −1, 1))

Численно устойчивее через atan2 (формула гаверсинуса-аналога):

θ = atan2( sqrt( (cos β₂ · sin Δλ)²
               + (cos β₁ · sin β₂ − sin β₁ · cos β₂ · cos Δλ)² ),
           sin β₁ · sin β₂ + cos β₁ · cos β₂ · cos Δλ )

где Δλ = λ₂ − λ₁. Это тот же расчёт, что и большой круг на сфере. Практически применяется редко (кроме затмений и мунданных аспектов), но важно для Плутона (β до 17°) и астероидов с большим наклонением.


2. ПОЛНЫЙ КАТАЛОГ АСПЕКТОВ

2.1. Гармоническая деривация

Любой аспект — это доля окружности:

aspect_angle(n, k) = k · 360 / n

где n — гармоника (harmonic), k — кратность (обычно 1 ≤ k ≤ n/2, чтобы угол не превышал 180°).

Аспект «n-й гармоники» соответствует делению круга на n частей. Соединение = гармоника 1. Оппозиция = 2. Тригон = 3. Квадратура = 4. И т.д.

Важное свойство: если k и n имеют общий делитель, аспект сводится к более низкой гармонике. Например, 2·360/4 = 180° — это оппозиция (гармоника 2), а не самостоятельный аспект 4-й гармоники. «Чистые» аспекты гармоники n — те, где gcd(k, n) = 1.

pure_aspects(n):
    return [ k*360/n for k in 1..floor(n/2) if gcd(k,n) == 1 ]

2.2. Мажорные (птолемеевы) аспекты — Major / Ptolemaic

Аспект (рус.)Англ.СимволУголГармоникаПрирода
СоединениеConjunction☌0°1нейтральный/усиливающий
ОппозицияOpposition☍180°2напряжённый
Тригон / ТринTrine△120°3гармоничный
КвадратураSquare□90°4напряжённый
СекстильSextile✶60°6 (= 2·3)гармоничный

Птолемеевы, потому что описаны в «Тетрабиблосе». Только они признавались в классической и средневековой астрологии. Секстиль — производный (6 = 2×3), поэтому слабее тригона.

2.3. Минорные аспекты — Minor

Аспект (рус.)Англ.СимволУголГармоникаАвтор/традиция
ПолусекстильSemisextile⚺30°12Кеплер
ПолуквадратSemisquare / Octile∠45°8Кеплер
ПолутораквадратSesquiquadrate / Sesquisquare / Trioctile⚼135°8 (k=3)Кеплер
Квиконс / ИнконъюнкцияQuincunx / Inconjunct⚻150°12 (k=5)Кеплер

Замечания:

  • 30° = 360/12, 150° = 5·360/12 — обе из 12-й гармоники.
  • 45° = 360/8, 135° = 3·360/8 — обе из 8-й гармоники.
  • «Инконъюнкт» в строгой традиции означал отсутствие аспекта (аверсия, aversion) — знаки, не видящие друг друга: 30°, 150°. Современное употребление сузило термин до 150°.
  • Полуквадрат и полутораквадрат вместе называют октильной группой.

2.4. Квинтильное семейство (5-я гармоника) — Quintile family

АспектАнгл.Угол (точно)ФормулаГармоника
Дециль / ПолуквинтильDecile / Semiquintile36°360/1010
КвинтильQuintile72°360/55
Тредециль / Сескви-квинтильTredecile / Sesquiquintile108°3·360/1010
БиквинтильBiquintile144°2·360/55

Символика 5-й гармоники: творчество, талант, мастерство, форма, «пятиконечная звезда». Введена Кеплером, развита Джоном Эдди.

Чистые аспекты гармоники 5: k=1 (72°), k=2 (144°). Чистые аспекты гармоники 10: k=1 (36°), k=3 (108°). (k=2, k=4, k=5 сводятся к 72°, 144°, 180°.)

2.5. Септильное семейство (7-я гармоника) — Septile family

АспектАнгл.Угол (точно)ДесятичноеВ град/мин
СептильSeptile360/751.428571°51°25′43″
БисептильBiseptile2·360/7102.857143°102°51′26″
ТрисептильTriseptile3·360/7154.285714°154°17′09″

Все три — чистые (7 — простое число). 7-я гармоника иррациональна относительно 360 в целых градусах — отсюда её «мистическая» репутация: судьба, рок, вдохновение, иррациональное, одержимость.

Рекомендуемые орбисы: очень узкие, 1–2°.

2.6. Новильное семейство (9-я гармоника) — Novile family

АспектАнгл.УголФормулаЧистый?
НовильNovile / Nonagon40°360/9да (gcd(1,9)=1)
БиновильBinovile80°2·360/9да (gcd(2,9)=1)
— (тригон)—120°3·360/9нет → гармоника 3
КвадрановильQuadnovile / Quadranovile160°4·360/9да (gcd(4,9)=1)

9 = 3², поэтому 9-я гармоника — «тригон тригона»: духовное завершение, посвящение, плод, вынашивание (9 месяцев). В индийской астрологии соответствует варге навамша (D9) — 9-я гармоника карты.

2.7. 11-я гармоника — Undecile

АспектУгол (точно)Десятичное
Ундециль (semi-undecile у некоторых школ)360/1132.727273°
Биундециль2·360/1165.454545°
Триундециль3·360/1198.181818°
Квадриундециль4·360/11130.909091°
Квинундециль5·360/11163.636364°

Все чистые (11 — простое). 11-я гармоника: по Эдди — «прорыв», выход за рамки, разрыв с нормой, эксцентричность. Часто ошибочно называют «ундециль» угол 33° (округление).

2.8. 13-я гармоника — Tredecile family (осторожно: омонимия)

АспектУголДесятичное
360/1327.6923°27°41′32″
2·360/1355.3846°55°23′05″
3·360/1383.0769°83°04′37″
4·360/13110.7692°110°46′09″
5·360/13138.4615°138°27′41″
6·360/13166.1538°166°09′14″

Все чистые (13 — простое). Внимание на терминологию: слово «tredecile» в западных источниках чаще означает 108° (3/10 круга), а не 13-ю гармонику. Для 13-й гармоники используют «13th harmonic aspect» без специального имени.

2.9. Сводная таблица всех углов

Угол (°)НазваниеГармоникаКласс
0.000Conjunction1major
27.69213th harmonic13exotic
30.000Semisextile12minor
32.727Undecile11exotic
36.000Decile / Semiquintile10quintile family
40.000Novile9novile family
45.000Semisquare / Octile8minor
51.429Septile7septile family
60.000Sextile6major
65.455Biundecile11exotic
72.000Quintile5quintile family
80.000Binovile9novile family
90.000Square4major
100.000Decile (10th of 1000?) — не использовать——
102.857Biseptile7septile family
108.000Tredecile / Sesquiquintile10quintile family
120.000Trine3major
135.000Sesquiquadrate8minor
144.000Biquintile5quintile family
150.000Quincunx / Inconjunct12minor
154.286Triseptile7septile family
160.000Quadnovile9novile family
165.000Quindecile (Ricardo)*—special
180.000Opposition2major

* Quindecile 165° — аспект, популяризированный Ricardo Ricardo / Noel Tyl (одержимость, навязчивость). Не путать с 24° (= 360/15), который тоже иногда зовут quindecile. Угол 165° = 11·360/24, то есть из 24-й гармоники.

2.10. Параллели и контрпараллели (аспекты по склонению)

Параллель (parallel, ∥) — два тела имеют одинаковое склонение (declination, δ) и одного знака. Контрпараллель (contraparallel, ⚯) — одинаковое по модулю склонение, но разных знаков.

is_parallel(δ₁, δ₂, orb):
    return sign(δ₁) == sign(δ₂) and |δ₁ − δ₂| ≤ orb

is_contraparallel(δ₁, δ₂, orb):
    return sign(δ₁) != sign(δ₂) and |δ₁ + δ₂| ≤ orb
    // эквивалентно: | |δ₁| − |δ₂| | ≤ orb при разных знаках

Универсальная форма через две проверки:

orb_parallel      = |δ₁ − δ₂|
orb_contraparallel= |δ₁ + δ₂|

Интерпретация: параллель ≈ соединение по силе, контрпараллель ≈ оппозиция. Типичный орбис: 1° (жёстко) — 1°30′. Некоторые школы (Charles Jayne, Kt Boehrer) используют 0°30′ для «точной» параллели.

Формула склонения из эклиптических координат — см. §8.1.

2.11. Антисы и контрантисы (Antiscia / Contra-antiscia)

Антис (antiscion, «тень») — точка, зеркально отражённая относительно оси солнцестояний 0° Рака — 0° Козерога (т.е. относительно 90°/270°). Две точки в антисе имеют равную продолжительность дня — отсюда «симпатическая» связь.

antiscion(λ) = (180 − λ) mod 360

Проверка: λ = 90° (0° Рака) → 90°. Ось неподвижна. λ = 0° (0° Овна) → 180° (0° Весов)?? — нет, это ошибка. Проверим ещё раз: отражение относительно точки 90° по формуле 2·90 − λ = 180 − λ. Для λ=0 → 180. Но 0° Овна и 0° Весов равноудалены от 0° Рака (по 90° в каждую сторону) — да, всё верно, это корректная пара антисов. Однако 0° Овна и 0° Весов также являются контрантисами друг друга (особый вырожденный случай на осях).

Классические пары знаков-антисов (относительно оси Рак/Козерог):

ЗнакАнтис-знак
Овен ↔ Дева0°♈ ↔ 30°♍ ...
Телец ↔ Лев
Близнецы ↔ Рак
Весы ↔ Рыбы
Скорпион ↔ Водолей
Стрелец ↔ Козерог

Проверка формулой: 15° Тельца = 45° абс. → antiscion = 180 − 45 = 135° = 15° Льва. ✓ 10° Близнецов = 70° → 180 − 70 = 110° = 20° Рака. ✓

Контрантис (contra-antiscion) — отражение относительно оси равноденствий 0° Овна — 0° Весов:

contra_antiscion(λ) = (360 − λ) mod 360

Эквивалентно: contra_antiscion(λ) = (antiscion(λ) + 180) mod 360.

Проверка: 15° Тельца = 45° → 360 − 45 = 315° = 15° Водолея. ✓

Классические пары знаков-контрантисов:

ЗнакКонтрантис-знак
Овен ↔ Рыбы
Телец ↔ Водолей
Близнецы ↔ Козерог
Рак ↔ Стрелец
Лев ↔ Скорпион
Дева ↔ Весы

Детекция контакта:

has_antiscia_contact(λ₁, λ₂, orb):
    a = antiscion(λ₁)
    return separation(a, λ₂) ≤ orb

has_contra_antiscia_contact(λ₁, λ₂, orb):
    c = contra_antiscion(λ₁)
    return separation(c, λ₂) ≤ orb

Отношение симметрично: antiscion(antiscion(λ)) = λ.

Орбис для антисов: классически очень узкий — 1° (Лилли требует партиль, т.е. тот же градус). Современные — до 2°.

Связь со склонением: точки в антисе имеют одинаковое склонение того же знака (при нулевой широте) — то есть антис ≈ параллель по долготе. Контрантис ≈ контрпараллель.


3. СИСТЕМЫ ОРБИСОВ

3.1. Традиционная система: орбисы планет (moiety)

В классике орбис принадлежит планете, а не аспекту. Это её «сфера лучей» (orb of light / orbis / radiation), простирающаяся на столько же градусов вперёд и назад.

Таблица 3.1.1 — Классические орбисы (Порфирий, Абу Машар, Сахль ибн Бишр, Ибн Эзра, Бонатти, аль-Бируни)

ПланетаОрбис (полный)Мойети (половина)
♄ Сатурн9°4°30′
♃ Юпитер9°4°30′
♂ Марс8°4°00′
☉ Солнце15°7°30′
♀ Венера7°3°30′
☿ Меркурий7°3°30′
☽ Луна12°6°00′

Источник: Porphyry, «Introduction to the Tetrabiblos», гл. 55: «Лучи Солнца достигают 30°, 15 вперёд и 15 назад. Луны — 24 градуса, 12 вперёд и 12 назад; Сатурн и Юпитер — 18 градусов, 9 вперёд и 9 назад; Марс — 16, 8 вперёд и 8 назад; Венера и Меркурий — 14, 7 вперёд и 7 назад.»

Терминологическая ловушка: Порфирий даёт суммарный «периметр» (30, 24, 18, 16, 14), Абу Машар / Ибн Эзра / Бонатти / Лилли дают орбис как «столько-то вперёд и столько-то назад» (15, 12, 9, 8, 7). Числа в таблице выше — это «вперёд и назад», то есть радиус сферы.

Таблица 3.1.2 — Уильям Лилли, «Christian Astrology» (1647), кн. I, гл. XIX, с. 107

Лилли даёт две колонки: свой опыт и «как пишут другие».

ПланетаЛилли (по опыту)Комментарий ЛиллиДревние
♄ Сатурн10°00′«According to others»9°00′
♃ Юпитер12°00′«As some have wrote»9°00′
♂ Марс7°30′«All consent»7°00′
☉ Солнце17°00′«Most say»15°00′
♀ Венера8°00′«Many write but»7°00′
☿ Меркурий7°00′«All consent only»7°00′
☽ Луна12°30′«Generally but»12°00′

Таблица 3.1.3 — Мойети по Лилли (колонка «по опыту», делённая пополам)

ПланетаМойети
☉ Солнце8°30′ (8.5°)
☽ Луна6°15′ (6.25°)
☿ Меркурий3°30′ (3.5°)
♀ Венера4°00′ (4.0°)
♂ Марс3°45′ (3.75°)
♃ Юпитер6°00′ (6.0°)
♄ Сатурн5°00′ (5.0°)

Аль-Бируни (Abu Rayhan al-Biruni, XI в.)

Аль-Бируни следует общей арабской линии: Солнце 15° вперёд и назад, Луна 12° вперёд и назад, Сатурн и Юпитер по 9°, Марс 8°, Венера и Меркурий по 7°. То есть его таблица совпадает с таблицей 3.1.1. Мойети Солнца 7°30′ — именно это значение Робсон позаимствовал для орбиса неподвижных звёзд 1-й величины.

Применение: формула мойети

orb_limit(P₁, P₂) = moiety(P₁) + moiety(P₂)

Примеры по Лилли:

  • ☉ + ☽ = 8.5 + 6.25 = 14.75°
  • ♄ + ♂ = 5.0 + 3.75 = 8.75°
  • ☿ + ♀ = 3.5 + 4.0 = 7.5°
  • ☉ + ♄ = 8.5 + 5.0 = 13.5°

Примеры по древним:

  • ☉ + ☽ = 7.5 + 6.0 = 13.5°
  • ♄ + ♂ = 4.5 + 4.0 = 8.5°

Критически важно: орбис одинаков для всех аспектов. Сатурн-Марс имеет орбис 8.75° и для соединения, и для полусекстиля — потому что орбис описывает досягаемость лучей планеты, а не «мощность аспекта».

Асимметрия орбисов (Ибн Эзра)

Ибн Эзра и Бонатти рассматривали ситуацию, когда одна планета уже «в орбисе» другой, но не наоборот:

Если между Луной и Сатурном 10 градусов, то Сатурн находится внутри орбиса Луны (12°), но Луна не находится внутри орбиса Сатурна (9°).

Это односторонняя связь, если применять индивидуальные орбисы, а не мойети. Реализация:

P1_sees_P2 = (delta ≤ orb(P₁))
P2_sees_P1 = (delta ≤ orb(P₂))
mutual     = P1_sees_P2 and P2_sees_P1

Большинство современных «традиционных» программ используют мойети (симметрично), но исторически более точная модель — асимметричная.

Другие небесные тела в традиции

ОбъектОрбис (традиция)
Звёзды 1-й величины7°30′ (Робсон)
Звёзды 2-й величины5°30′
Звёзды 3-й величины3°40′
Асцендент, MC~5° (нет классического консенсуса)
Жребии (Lots/Parts)Орбис планеты-управителя, или 0 (только партиль)
Лунные узлыОбычно без орбиса или 3°

Renaissance Astrology (Christopher Warnock) и другие традиционалисты: неплатенарные точки (Асцендент, узлы, жребии) не имеют собственных орбисов — используется орбис планеты, которая к ним аспектирует.

3.2. Современная система: фиксированные орбисы по аспектам

Таблица 3.2.1 — «Стандартная учебная» (типовая западная)

АспектОрбис
Соединение8°
Оппозиция8°
Тригон8°
Квадратура8°
Секстиль6°
Полуквадрат2°
Полутораквадрат2°
Квиконс3°
Полусекстиль2°
Квинтиль/Биквинтиль2°
Септильные1°
Новильные1°

Таблица 3.2.2 — Astrotheme (натальная карта)

АспектОрбис
Соединение10.5°
Оппозиция10.0°
Тригон8.3°
Квадратура7.8°
Секстиль6.1°
Квиконс2.7°
Полутораквадрат2.5°
Полуквадрат1.5°
Полусекстиль1.0°
Квинтиль0.8°
Биквинтиль0.8°

Поправки Astrotheme:

  • Если участвует Солнце или Луна: +0.3° (18′) ко всем аспектам.
  • Если аспект Солнце–Луна: +0.6° (36′).
  • Лунные узлы и Лилит: орбис ограничен максимум 3°.

Таблица 3.2.3 — Astrotheme (синастрия / совместимость)

АспектОрбис
Соединение10.0°
Оппозиция8.0°
Тригон6.0°
Квадратура6.0°
Секстиль4.5°
Квиконс2.0°
Полутораквадрат1.0°
Полуквадрат1.0°
Полусекстиль1.0°
Квинтиль / Биквинтиль1.0°

Таблица 3.2.4 — Astrotheme (транзиты)

АспектОрбис
Соединение2.6°
Оппозиция2.5°
Тригон2.3°
Квадратура2.3°
Секстиль2.3°
Квиконс1.5°
Полутораквадрат1.5°
Полуквадрат1.3°
Полусекстиль1.0°
Квинтиль / Биквинтиль1.0°

Поправки транзитов: +0.1° (6′) при участии светила, +0.2° (12′) для Солнце–Луна.

Таблица 3.2.5 — «Широкая» схема (TimePassages / Solar Fire defaults)

АспектОрбис
Соединение10.0°
Оппозиция10.0°
Тригон10.0°
Квадратура10.0°
Секстиль8.0°
Полусекстиль6.0°
Полуквадрат6.0°
Квиконс (inconjunct)5.0°
Квинтиль4.0°
Биквинтиль4.0°
Полутораквадрат4.0°

Таблица 3.2.6 — «Узкая» исследовательская схема (statistical / Gauquelin-style)

АспектОрбис
Соединение6°
Оппозиция6°
Тригон5°
Квадратура5°
Секстиль4°
Все минорные1–2°
Все экзотические (7, 9, 11, 13)0.5–1°

3.3. Орбис как функция участвующих планет (гибридная современная)

Самая распространённая схема в софте: базовый орбис аспекта × множитель планеты, либо матрица «планета × аспект».

Таблица 3.3.1 — Матрица «планета × аспект» (типовой софт, градусы)

Планета☌☍△□✶30/45/135/150minor
☉ Солнце101088631.5
☽ Луна101088631.5
☿ Меркурий7766421
♀ Венера7766421
♂ Марс8877521
♃ Юпитер9977521
♄ Сатурн9977521
♅ Уран665541.51
♆ Нептун665541.51
♇ Плутон665541.51
☊ Узлы5544310.5
ASC/MC8877521
Хирон, астероиды3333210.5

Правило комбинирования (три варианта):

// А) максимум — самая либеральная
orb_limit = max(orb[P₁][A], orb[P₂][A])

// Б) среднее — «мойети-подобная»
orb_limit = (orb[P₁][A] + orb[P₂][A]) / 2

// В) минимум — самая строгая
orb_limit = min(orb[P₁][A], orb[P₂][A])

Наиболее распространён вариант А (максимум) — «светило тянет орбис на себя».

Мультипликативная схема

orb_limit = base_orb[A] × weight[P₁] × weight[P₂]

или

orb_limit = base_orb[A] × max(weight[P₁], weight[P₂])

Типовые веса:

Класс объектаweight
Светила (☉, ☽)1.25
Личные (☿, ♀, ♂)1.00
Социальные (♃, ♄)1.00
Высшие (♅, ♆, ♇)0.85
Углы (ASC, MC)1.00
Узлы, Лилит, Хирон0.60
Астероиды, фиктивные0.40

3.4. Орбис как функция «силы» аспекта (гармоническая деградация)

Идея (Эдди, Хэмблин, гармонисты): чем выше гармоника, тем уже орбис.

orb_limit(n) = K / n

где n — номер гармоники, K — константа (обычно 8…12).

При K = 10:

ГармоникаАспектыorb = 10/n
10°10.00°
2180°5.00°
3120°3.33°
490°2.50°
572°, 144°2.00°
660°1.67°
751.43°, ...1.43°
845°, 135°1.25°
940°, 80°, 160°1.11°
1036°, 108°1.00°
1132.73°, ...0.91°
1230°, 150°0.83°
1327.69°, ...0.77°

Такая схема даёт слишком узкие мажорные орбисы для практики, поэтому чаще используют:

orb_limit(n) = K / sqrt(n)

При K = 12:

Гармоникаorb = 12/√n
112.00°
28.49°
36.93°
46.00°
55.37°
64.90°
74.54°
84.24°
94.00°
123.46°

Или эмпирический компромисс:

orb_limit(n) = 8 / n^0.7

3.5. «Аспекты — только в пределах знаков» (traditional sign-based)

Строгая эллинистическая модель: аспект существует только если планеты находятся в знаках, образующих аспект, независимо от точного угла (whole-sign aspects). Орбис определяет лишь силу и момент перфекции.

sign(λ) = floor(λ / 30)                  // 0..11
sign_distance = (sign(λ₂) − sign(λ₁)) mod 12
// 0=соединение, 2/10=секстиль, 3/9=квадратура, 4/8=тригон, 6=оппозиция
// 1, 5, 7, 11 = аверсия (нет аспекта)

Комбинация: градусный аспект внутри правильных знаков = наиболее сильная конфигурация. Градусный аспект, «выпавший» за границу знака (out-of-sign / dissociate aspect, диссоциированный аспект) — ослабленный и «неправильный».

is_dissociate(λ₁, λ₂, A):
    degree_aspect = (|separation(λ₁,λ₂) − A| ≤ orb)
    sd = (sign(λ₂) − sign(λ₁)) mod 12
    sign_aspect = sd in EXPECTED_SIGN_DISTANCES[A]
    return degree_aspect and not sign_aspect

4. АСПЕКТНЫЕ КОНФИГУРАЦИИ (PATTERNS)

Общие принципы детекции:

  • T — допуск (tolerance), обычно уже, чем обычный орбис: 6–8° для мажорных внутри фигур, 3° для квиконсов.
  • Планеты в фигуре могут быть стеллиумом (несколько в соединении на одном углу) — большинство алгоритмов сначала кластеризует соединения, потом ищет фигуры между кластерами.
  • Следует избегать дубликатов: канонизировать набор планет (сортировка по id) и дедуплицировать.

4.0. Предварительная кластеризация соединений

cluster_conjunctions(planets, orb_conj):
    clusters = []
    for p in planets sorted by longitude:
        placed = false
        for c in clusters:
            if separation(mean_longitude(c), p.lon) ≤ orb_conj:
                c.add(p); placed = true; break
        if not placed:
            clusters.append(new Cluster(p))
    // важен второй проход с учётом wraparound 360→0
    merge_wraparound(clusters, orb_conj)
    return clusters

Вспомогательная функция «круговое среднее»:

mean_longitude(cluster):
    sx = Σ cos(λᵢ);  sy = Σ sin(λᵢ)
    return atan2(sy, sx) mod 360

4.1. Большой трин (Grand Trine, Большой тригон)

Структура: 3 планеты, попарно в тригонах (120°). Образует равносторонний треугольник.

detect_grand_trine(planets, T=8):
    for each combination (a,b,c) of 3 planets:
        if aspect(a,b, 120, T) and aspect(b,c, 120, T) and aspect(a,c, 120, T):
            emit GrandTrine(a,b,c, element=dominant_element(a,b,c))

Подтип: если все три планеты в знаках одной стихии → «чистый» большой трин в огне/земле/воздухе/воде. Иначе — «диссоциированный».

4.2. Т-квадрат (T-Square, Тау-квадрат)

Структура: 2 планеты в оппозиции (180°), обе в квадратуре (90°) к третьей — апексу (apex / focal planet).

detect_t_square(planets, T=7):
    for each pair (a,b):
        if not aspect(a,b, 180, T): continue
        for c in planets, c ∉ {a,b}:
            if aspect(a,c, 90, T) and aspect(b,c, 90, T):
                emit TSquare(opposition=(a,b), apex=c)

Важное уточнение: апекс — точка разрядки напряжения. Пустая точка (empty leg) — градус, противоположный апексу: (λ_apex + 180) mod 360.

Подтипы по модальности: кардинальный, фиксированный, мутабельный T-квадрат.

4.3. Большой крест (Grand Cross, Большой квадрат)

Структура: 4 планеты, две пары оппозиций, все смежные пары в квадратурах.

detect_grand_cross(planets, T=7):
    for each combination (a,b,c,d):
        // проверяем все 3 варианта разбиения на пары оппозиций
        for (p1,p2,q1,q2) in [(a,c,b,d), (a,b,c,d), (a,d,b,c)]:
            if aspect(p1,p2,180,T) and aspect(q1,q2,180,T)
               and aspect(p1,q1,90,T) and aspect(q1,p2,90,T)
               and aspect(p2,q2,90,T) and aspect(q2,p1,90,T):
                emit GrandCross(p1,q1,p2,q2)

Эквивалентная проверка: два перекрывающихся T-квадрата, у которых апекс одного лежит в оппозиции к апексу другого.

4.4. Йод / Палец Бога (Yod, Finger of God / Finger of Fate)

Структура: 2 планеты в секстиле (60°), обе в квиконсе (150°) к третьей — апексу.

detect_yod(planets, T_sextile=4, T_quincunx=3):
    for each pair (a,b):
        if not aspect(a,b, 60, T_sextile): continue
        for c in planets, c ∉ {a,b}:
            if aspect(a,c, 150, T_quincunx) and aspect(b,c, 150, T_quincunx):
                emit Yod(base=(a,b), apex=c)

Допуск для йода традиционно жёстче обычного: 3° максимум, часто 2°. Это ключевая деталь — при широком допуске йоды находятся в каждой второй карте.

Reaction point / «точка реакции» — градус, противоположный апексу: (λ_apex + 180) mod 360. Это середина секстильного основания + 180°.

4.5. Мистический прямоугольник (Mystic Rectangle)

Структура: 4 планеты: 2 оппозиции + 2 тригона + 2 секстиля. Прямоугольник, где диагонали — оппозиции, длинные стороны — тригоны, короткие — секстили.

detect_mystic_rectangle(planets, T=6):
    for each combination (a,b,c,d):
        // a—c и b—d оппозиции (диагонали)
        if aspect(a,c,180,T) and aspect(b,d,180,T):
            // проверяем стороны
            sides = [(a,b),(b,c),(c,d),(d,a)]
            trines   = count of sides matching 120±T
            sextiles = count of sides matching 60±T
            if trines == 2 and sextiles == 2:
                emit MysticRectangle(a,b,c,d)

Структурная закономерность: тригоны должны быть противоположными сторонами, и секстили тоже. Если a—b секстиль, то c—d секстиль, а b—c и d—a — тригоны.

4.6. Воздушный змей (Kite)

Структура: большой трин + четвёртая планета в оппозиции к одной из вершин трина (и, следовательно, в секстилях к двум другим).

detect_kite(planets, T=7):
    for gt in detect_grand_trine(planets, T):
        (a,b,c) = gt
        for d in planets, d ∉ gt:
            for tail in [a,b,c]:
                others = gt \ {tail}
                if aspect(tail, d, 180, T)
                   and aspect(others[0], d, 60, T)
                   and aspect(others[1], d, 60, T):
                    emit Kite(trine=gt, tail=tail, apex=d)

Терминология: d — «нос/вершина змея» (kite apex, focal point), tail — «хвост».

4.7. Большой секстиль / Звезда Давида (Grand Sextile / Star of David / Hexagon)

Структура: 6 планет, равномерно через 60°. Содержит 2 больших трина, 3 оппозиции, 6 секстилей.

detect_grand_sextile(planets, T=6):
    for each combination (p₁..p₆):
        sorted by longitude
        ok = true
        for i in 0..5:
            if not aspect(p[i], p[(i+1) mod 6], 60, T): ok = false
        // + проверка оппозиций
        for i in 0..2:
            if not aspect(p[i], p[i+3], 180, T): ok = false
        if ok: emit GrandSextile(p₁..p₆)

Star of David (Звезда Давида) — иногда используется как синоним Grand Sextile (потому что фигура содержит два наложенных больших трина = гексаграмма). Некоторые авторы различают: Star of David = именно два больших трина, даже если не все секстили в орбисе.

detect_star_of_david(planets, T=7):
    gts = detect_grand_trine(planets, T)
    for each pair (gt1, gt2) with disjoint planet sets:
        // проверяем, что вершины чередуются, т.е. между ними секстили/оппозиции
        if all pairwise (x∈gt1, y∈gt2) form 60° or 180° within T:
            emit StarOfDavid(gt1, gt2)

4.8. Стеллиум (Stellium, Стеллиум)

Структура: 3 (или 4) и более планет в соединении / в одном знаке / в одном доме.

Три определения — выбирать по конфигурации:

// A) по соединениям (цепочка)
detect_stellium_by_conjunction(planets, orb=8, min_count=3):
    clusters = cluster_conjunctions(planets, orb)
    return [c for c in clusters if len(c) ≥ min_count]

// B) по знаку
detect_stellium_by_sign(planets, min_count=3):
    group by floor(λ/30)
    return groups with count ≥ min_count

// C) по дому
detect_stellium_by_house(planets, min_count=3):
    group by house_number
    return groups with count ≥ min_count

Строгий вариант: весь стеллиум умещается в один орбис, т.е. separation(min λ, max λ) ≤ orb. Нестрогий (цепочный): каждая планета в орбисе к соседней, но крайние могут быть далеко — это часто даёт «ложные» стеллиумы длиной 30°+.

4.9. Колыбель (Cradle)

Структура: 4 планеты, образующие цепочку из 3 секстилей (60-60-60), концы цепочки — в оппозиции (180°). Внутри есть 2 тригона. Это «половина» большого секстиля.

detect_cradle(planets, T=6):
    for each ordered sequence (a,b,c,d) by longitude:
        if aspect(a,b,60,T) and aspect(b,c,60,T) and aspect(c,d,60,T)
           and aspect(a,d,180,T)
           and aspect(a,c,120,T) and aspect(b,d,120,T):
            emit Cradle(a,b,c,d)

Проверка тригонов избыточна (следует из секстилей), но полезна как валидация допусков.

4.10. Молот Тора (Thor's Hammer / Молот Тора / Fist of God / God's Fist)

Структура: 2 планеты в квадратуре (90°), обе в полутораквадрате (135°) к третьей — апексу.

detect_thors_hammer(planets, T_square=6, T_sesq=3):
    for each pair (a,b):
        if not aspect(a,b, 90, T_square): continue
        for c in planets, c ∉ {a,b}:
            if aspect(a,c, 135, T_sesq) and aspect(b,c, 135, T_sesq):
                emit ThorsHammer(base=(a,b), apex=c)

Геометрическая проверка: 90 + 135 + 135 = 360 ✓. Апекс — точка предельного напряжения и вынужденного действия.

4.11. Прямоугольник (Rectangle)

Общее семейство: 4 планеты, 2 оппозиции + 2 пары равных сторон.

Мистический прямоугольник (§4.5): стороны 60/120. Прямоугольник 45/135 (Octile Rectangle / «Rectangle»): стороны 45° и 135°, диагонали 180°.

detect_octile_rectangle(planets, T=3):
    for each combination (a,b,c,d):
        if aspect(a,c,180,T) and aspect(b,d,180,T):
            if (aspect(a,b,45,T) and aspect(c,d,45,T)
                and aspect(b,c,135,T) and aspect(d,a,135,T)):
                emit Rectangle(a,b,c,d)

Проверка суммы: 45 + 135 + 45 + 135 = 360 ✓

Прямоугольник 30/150: стороны 30° и 150°, диагонали 180°. 30+150+30+150 = 360 ✓

4.12. Бумеранг / Двойной йод-ключ (Boomerang / Focused Yod)

Структура: йод + четвёртая планета в оппозиции к апексу йода (т.е. в точке реакции). Эта четвёртая планета оказывается в полусекстилях (30°) к обеим планетам основания йода.

detect_boomerang(planets, T_yod=3, T_opp=6, T_semisextile=3):
    for yod in detect_yod(planets, ...):
        (base_a, base_b, apex) = yod
        for d in planets, d ∉ yod:
            if aspect(apex, d, 180, T_opp)
               and aspect(base_a, d, 30, T_semisextile)
               and aspect(base_b, d, 30, T_semisextile):
                emit Boomerang(yod=yod, release_point=d)

Проверка: 30 + 30 + 150 + 150 = 360 ✓. Точка d — «точка разрядки/выхода» энергии йода.

4.13. Двойной йод (Double Yod / Double Yod Key)

Структура: два йода, разделяющих общее основание или наложенные так, что образуется 5-планетная / 4-планетная фигура.

Классический Double Yod Key: 4 планеты — два секстиля и четыре квиконса, при этом две пары формируют два йода, чьи апексы находятся в секстиле друг к другу.

detect_double_yod(planets, T=3):
    yods = detect_yod(planets, T)
    for each pair (y1, y2):
        if y1.apex != y2.apex:
            // общая база или общая планета
            shared = y1.planets ∩ y2.planets
            if len(shared) ≥ 1:
                // проверить секстиль между апексами
                if aspect(y1.apex, y2.apex, 60, T):
                    emit DoubleYod(y1, y2)

Альтернативная геометрия (5 планет): центральная планета — апекс обоих йодов с двумя разными секстильными базами.

4.14. Хеле (Hele / Hele Pattern)

Структура: 4 планеты. Две оппозиции, разделённые тригоном и секстилем в определённом чередовании. Один из «прямоугольных» подтипов — иногда его определяют как две оппозиции, чьи концы связаны тригоном и секстилем с одной стороны.

Наиболее распространённая формулировка (Bil Tierney, «Dynamics of Aspect Analysis»): две оппозиции, соединённые двумя тригонами и двумя секстилями — то есть это фактически синоним мистического прямоугольника у ряда авторов. У других — фигура из 4 планет с расстояниями 60-120-60-120.

Практичная реализация: трактовать Hele как мистический прямоугольник (§4.5) с пометкой синонима, либо как:

detect_hele(planets, T=6):
    // 4 планеты в последовательности с промежутками 60,120,60,120
    for each ordered (a,b,c,d) by longitude:
        g1 = separation_signed_forward(a,b)
        g2 = separation_signed_forward(b,c)
        g3 = separation_signed_forward(c,d)
        if |g1-60|≤T and |g2-120|≤T and |g3-60|≤T:
            emit Hele(a,b,c,d)   // d—a автоматически 120

4.15. Прочие фигуры (краткий справочник детекции)

ФигураСоставУсловия
Wedge / Клин (Minor Grand Trine)3 планетыоппозиция + тригон + секстиль
Boat / Trapezoid4 планетыGrand Trine без одной стороны + ... : 2 секстиля + 2 тригона + 1 оппозиция
Grand Quintile5 планетвсе смежные пары 72°±T
Golden Yod / Мистический йод3 планеты2 биквинтиля (144°) + 1 квинтиль (72°); 144+144+72=360 ✓
Pentagram5 планетквинтили/биквинтили, гармоника 5
Grand Septile7 планетвсе смежные 51.43°±T
Rosetta5 планеткомбинация тригонов/квадратур, редко реализуется
Yod с апексом-стеллиумом≥4кластеризация до детекции
Singleton1 планетаединственная планета в полусфере/стихии/модальности, не элемент аспектной геометрии
Splash / Bowl / Bucket / Locomotive / Bundle / Seesaw / Slingвсе планетыэто типы карт по Марку Эдмунду Джонсу, не аспектные фигуры; детектируются по распределению долгот, см. ниже

Типы карт по Джонсу (Jones Patterns) — быстрый алгоритм

classify_jones(longitudes):
    sorted = sort(longitudes)
    gaps = [ (sorted[(i+1)%n] − sorted[i]) mod 360 for i in 0..n-1 ]
    max_gap = max(gaps)
    span = 360 − max_gap                       // ширина занятой дуги
    if span ≤ 120:              return BUNDLE
    if max_gap ≥ 120 and второй_разрыв малый:  return BOWL  // span ≤ 180
    if есть один планета отдельно за разрывом ≥ 60 от «чаши»: return BUCKET (handle = та планета)
    if span ≈ 240 (max_gap ≈ 120):             return LOCOMOTIVE
    if 2 группы, разделённые двумя разрывами ≥ 60: return SEESAW
    if 8+ разрывов примерно равны:             return SPLASH
    else:                                      return SPLAY

4.16. Универсальный движок детекции конфигураций

Вместо отдельного кода на каждую фигуру — декларативное описание:

PATTERN_DEFS = [
  { name: "Grand Trine",   n: 3, edges: [(0,1,120),(1,2,120),(0,2,120)],      tol: 8 },
  { name: "T-Square",      n: 3, edges: [(0,1,180),(0,2,90),(1,2,90)],        tol: 7, apex: 2 },
  { name: "Yod",           n: 3, edges: [(0,1,60),(0,2,150),(1,2,150)],       tol: 3, apex: 2 },
  { name: "Thor's Hammer", n: 3, edges: [(0,1,90),(0,2,135),(1,2,135)],       tol: 3, apex: 2 },
  { name: "Golden Yod",    n: 3, edges: [(0,1,72),(0,2,144),(1,2,144)],       tol: 2, apex: 2 },
  { name: "Grand Cross",   n: 4, edges: [(0,2,180),(1,3,180),(0,1,90),(1,2,90),(2,3,90),(3,0,90)], tol: 7 },
  { name: "Mystic Rect",   n: 4, edges: [(0,2,180),(1,3,180),(0,1,60),(1,2,120),(2,3,60),(3,0,120)], tol: 6 },
  { name: "Kite",          n: 4, edges: [(0,1,120),(1,2,120),(0,2,120),(0,3,180),(1,3,60),(2,3,60)], tol: 7 },
  { name: "Cradle",        n: 4, edges: [(0,1,60),(1,2,60),(2,3,60),(0,3,180),(0,2,120),(1,3,120)], tol: 6 },
  { name: "Boomerang",     n: 4, edges: [(0,1,60),(0,2,150),(1,2,150),(2,3,180),(0,3,30),(1,3,30)], tol: 3 },
  { name: "Rectangle",     n: 4, edges: [(0,2,180),(1,3,180),(0,1,45),(1,2,135),(2,3,45),(3,0,135)], tol: 3 },
  { name: "Grand Sextile", n: 6, edges: [(0,1,60),(1,2,60),(2,3,60),(3,4,60),(4,5,60),(0,5,60),
                                          (0,3,180),(1,4,180),(2,5,180)],     tol: 6 },
]

detect_all(bodies):
    results = []
    clusters = cluster_conjunctions(bodies, 8)   // опционально
    for def in PATTERN_DEFS:
        for combo in combinations(clusters, def.n):
            for perm in permutations(combo):     // нужны все перестановки
                if all( |separation(perm[i].lon, perm[j].lon) − angle| ≤ def.tol
                        for (i,j,angle) in def.edges ):
                    results.append(Pattern(def.name, perm, tightness=...))
                    break                         // одна перестановка достаточна
    return deduplicate(results)

Оптимизация: перестановок n! многовато для n=6 (720). Ускорение — сортировать участников по долготе перед проверкой (для симметричных фигур этого достаточно) и использовать canonical form для дедупликации.

Оценка «плотности» фигуры (tightness):

tightness = 1 − (Σ |actual − ideal| ) / (Σ tol)

или

tightness = 1 − max(|actual − ideal|) / tol

5. ГАРМОНИЧЕСКАЯ АСТРОЛОГИЯ (HARMONICS)

5.1. Джон Эдди (John Addey, 1920–1982)

Ключевой труд: «Harmonics in Astrology» (1976). Идея: астрологическое влияние — это волновой феномен. Зодиак — окружность, на которой накладываются волны разных частот (гармоник). Каждая гармоника n — это синусоида, укладывающаяся в круг n раз.

Из этой модели следуют два вывода:

  1. Аспекты — не самостоятельные сущности, а следствие наложения гармоник.
  2. Аспект угла k·360/n в радиксе = соединение в n-й гармонической карте.

5.2. Формула гармонической карты

harmonic_longitude(λ, n) = (λ × n) mod 360

Полный алгоритм:

harmonic_chart(bodies, n):
    result = []
    for b in bodies:
        λ_abs = absolute_longitude(b)        // 0..360 от 0° Овна
        λ_h   = (λ_abs * n) mod 360
        result.append( Body(b.id, λ_h) )
    return result

Пример. Планета в 23°33′ Скорпиона.

  • Абсолютная долгота: Скорпион начинается с 210°; 210 + 23.55 = 233.55° (233°33′).
  • 5-я гармоника: 233.55 × 5 = 1167.75°.
  • 1167.75 − 3×360 = 1167.75 − 1080 = 87.75°.
  • 87.75° = 87°45′ = 27°45′ Близнецов.

5.3. Почему аспект превращается в соединение

Пусть λ₂ − λ₁ = k·360/n (точный аспект n-й гармоники). Тогда:

λ₂ᴴ − λ₁ᴴ = (λ₂·n − λ₁·n) mod 360
          = ( (k·360/n)·n ) mod 360
          = (k·360) mod 360
          = 0

То есть точный аспект n-й гармоники становится точным соединением в H(n). Именно поэтому гармонические карты «фокусируют» слабые аспекты.

Аналогично: аспект 2k·360/n в радиксе → оппозиция в H(n/2) и т.д.

5.4. Ключевое следствие: умножение орбиса

Орбис тоже умножается на n:

orb_in_harmonic = orb_in_radix × n

Значит, для H(7) орбис соединения 7° соответствует радиксному орбису всего 1°. Практическое правило: в гармонической карте используйте орбис соединения не более 8/n — иначе конфигурация будет ложной.

Обратно: если вы хотите в радиксе орбис 1° для септиля, в H(7) орбис соединения = 7°.

5.5. Дробные и «возрастные» гармоники

Возрастная гармоника (Age Harmonic) — Robert Hand / Michael Harding:

age_harmonic_n = age_in_years + 1        // или точный возраст в годах (дробный)
λ_age = (λ × (age + 1)) mod 360

Для дробных n формула та же — n просто вещественное число. При n = 1 получаем радикс.

Обратная гармоника: λ / n даёт неоднозначность (n решений). Используется редко.

5.6. Гармоники и аспекты в гармонической карте

В H(n) можно искать не только соединения, но и обычные аспекты — это соответствует композитным гармоникам. Тригон в H(5) = аспект 360/15 = 24° в радиксе (5×3 = 15-я гармоника).

radix_angle = k × 360 / (n × m)

где n — номер гармонической карты, m — гармоника аспекта внутри неё.

5.7. Гармонический анализ распределения (harmonic spectrum)

Метод Эдди: для набора данных (например, 1000 дат рождения врачей) строится распределение углов Солнце-Сатурн, затем через преобразование Фурье ищутся выделяющиеся гармоники.

// Амплитуда n-й гармоники в выборке углов θᵢ (i=1..N)
A_n = (2/N) · | Σᵢ exp( i · n · θᵢ · π/180 ) |
// или раздельно:
C_n = (2/N) · Σ cos(n·θᵢ)
S_n = (2/N) · Σ sin(n·θᵢ)
A_n = sqrt(C_n² + S_n²)
φ_n = atan2(S_n, C_n) / n        // фаза

Статистическая значимость: при равномерном случайном распределении A_n распределено по Рэлею, и N·A_n²/2 ~ χ² с 2 степенями свободы (тест Рэлея).

5.8. Гармоническая функция аспектов (Addey / Hamblin waveform)

Вместо дискретных орбисов — непрерывная функция:

strength(θ) = Σₙ aₙ · cos(n·θ + φₙ)

Простейший практический вариант — «косинусный аспектарий»:

aspect_wave(θ, n) = cos(n · θ)     // максимум при θ = k·360/n

Суммируя первые несколько гармоник с весами, получают гладкую кривую силы аспекта без «обрыва на орбисе».

5.9. Соответствие гармоник и варг (Vargas) в джйотиш

ГармоникаВаргаСанскритТема
1D1Рашитело, жизнь
2D2Хорабогатство
3D3Дрекканабратья/сёстры
4D4Чатуртхамшанедвижимость
7D7Саптамшадети
9D9Навамшасупруг, дхарма
10D10Дашамшакарьера
12D12Двадашамшародители
16D16Шодашамшакомфорт
20D20Вимшамшадуховность
24D24Чатурвимшамшаобразование
27D27Накшатрамшасила
30D30Тримшамшабеды
60D60Шаштьямшавсё, кармическая суть

Внимание: варги в джйотиш вычисляются не по формуле λ×n mod 360 напрямую — там деление знака на n частей с последующим отображением по специфическим правилам для каждой варги. Формула Эдди — западная и даёт другой результат. Совпадение только концептуальное.


6. МИДПОЙНТЫ (MIDPOINTS) — КОСМОБИОЛОГИЯ / ЭБЕРТИН

6.1. Основы

Мидпойнт (midpoint, средняя точка, полусумма) — точка, равноудалённая от двух планет по эклиптике. Обозначение: A/B (читается «A slash B»).

Школа: Альфред Витте (Гамбургская школа, ураническая астрология, 1920-е) → Рейнхольд Эбертин (космобиология, «Kombination der Gestirneinflüsse» / «The Combination of Stellar Influences», 1940).

6.2. Формула мидпойнта — две точки

Любая пара точек на окружности имеет две средних точки, отстоящие на 180° друг от друга.

midpoint_direct(λ₁, λ₂):
    // «ближний» мидпойнт — на короткой дуге
    d = (λ₂ − λ₁) mod 360
    if d > 180: d = d − 360           // −180..180
    return (λ₁ + d/2) mod 360

midpoint_indirect(λ₁, λ₂):
    return (midpoint_direct(λ₁, λ₂) + 180) mod 360

Наивная формула (λ₁ + λ₂)/2 НЕВЕРНА при пересечении 0°/360°. Пример: λ₁ = 350°, λ₂ = 10°. Наивно: (350+10)/2 = 180° — это дальний мидпойнт. Правильный ближний: 0°.

Терминология:

  • Direct midpoint / near midpoint (прямой, ближний) — на короткой дуге между планетами. Всегда separation(λ₁, mid) ≤ 90°.
  • Indirect midpoint / far midpoint (косвенный, дальний) — противоположная точка.

В космобиологии обе точки равнозначны (планета на любой из них активирует мидпойнт), поскольку работа ведётся на 90°-диске, где они совпадают.

Векторная форма (устойчива численно):

midpoint_direct(λ₁, λ₂):
    x = cos(λ₁) + cos(λ₂)
    y = sin(λ₁) + sin(λ₂)
    if |x| < ε and |y| < ε:   // точная оппозиция — мидпойнт неопределён
        return AMBIGUOUS
    return atan2(y, x) mod 360

6.3. Число мидпойнтов

Для N тел: C(N,2) = N(N−1)/2 пар, каждая даёт 2 точки.

N телПарМидпойнт-точек
104590
1491182
16120240
20190380

6.4. Планетарные картины (Planetary Pictures)

Планетарная картина — конфигурация, где мидпойнт двух точек совпадает с третьей точкой или мидпойнтом другой пары.

Форма A/B = C:

midpoint(A, B) ≈ C   (в пределах орбиса)

Читается: «C находится на мидпойнте A/B» или «соединённая символика A и B фокусируется через C».

Форма A/B = C/D (обобщённая, витте-ураническая):

midpoint(A, B) ≈ midpoint(C, D)

Эквивалентная алгебраическая форма (работает при отсутствии wraparound-проблем):

A + B ≡ C + D   (mod 360)

Это фундаментальное уравнение уранической астрологии. Из него выводятся все остальные формы:

A + B = C + D           // базовая
A + B − C = D           // «сумма минус» — точка D вычисляемая
A + B = 2C              // A/B = C, то есть C — мидпойнт A и B
A − B = C − D           // «равные расстояния» — симметрия
A + B = C + Ascendant   // персонализированная картина

Симметричные пары (Half-sums): если A + B = C + D, то все четыре точки симметричны относительно общей оси мидпойнта.

6.5. 90-градусный диск (90° Dial)

Идея: свернуть 360° в 90°, чтобы соединение, квадратура, оппозиция и «три четверти» (270°) оказались в одной точке.

dial90(λ) = λ mod 90

Свойства:

  • ☌ (0°), □ (90°), ☍ (180°), □ (270°) → все дают одинаковую позицию на 90°-диске.
  • Это в точности 4-я гармоника: dial90(λ) = harmonic(λ, 4) / 4.
  • Эквивалентно: harmonic_longitude(λ, 4) = 4 × dial90(λ).

Расстояние на 90°-диске:

dial90_separation(λ₁, λ₂):
    d = (λ₁ − λ₂) mod 90
    if d > 45: d = 90 − d
    return d                    // 0..45

Другие диски:

ДискФормулаГармоникаЧто объединяет
360°λ1всё
180°λ mod 1802☌, ☍
90°λ mod 904☌, □, ☍ (жёсткие)
45°λ mod 458+ ∠, ⚼ (полу/полутора)
22.5°λ mod 22.51616-я гармоника
120°λ mod 1203☌, △
72°λ mod 725☌, квинтили
51.43°λ mod (360/7)7☌, септили
30°λ mod 3012☌, ⚺, □(?), ⚻, ☍

Космобиологический стандарт: 90° диск как основной, 45° для тонких деталей.

6.6. Мидпойнт-деревья (Midpoint Trees)

Для каждой планеты (или угла) собираются все мидпойнты, на которых она стоит.

build_midpoint_tree(focal, bodies, orb):
    tree = []
    for each pair (A, B) in bodies, A ≠ B, A ≠ focal, B ≠ focal:
        m_dir = midpoint_direct(λ_A, λ_B)
        m_ind = (m_dir + 180) mod 360
        for m in [m_dir, m_ind]:
            // на 90°-диске:
            d = dial90_separation(λ_focal, m)
            if d ≤ orb:
                tree.append( MidpointEntry(A, B, orb=d, indirect=(m==m_ind)) )
    sort tree by orb ascending
    return tree

Представление:

☉ Солнце
  ♂/♄   0°12'
  ♀/ASC 0°31'
  ☽/♃   0°47'
  ♅/MC  1°05'

6.7. Орбисы для мидпойнтов

Эбертин настаивал на очень узких орбисах:

УровеньОрбисПрименение
Максимально жёсткий0°30′«Ядро» картины
Стандарт Эбертина1°00′Натал
Расширенный1°30′Натал, включая вторичные
Предельный2°00′Только для светил / ASC / MC
Транзиты/дирекции0°30′ – 1°00′Прогностика

Важно: орбис на 90°-диске — это «свёрнутый» орбис. Орбис 1° на 90°-диске = 1° в 360° для соединения, но также «покрывает» точки в 89°–91°, 179°–181°, 269°–271°.

Эбертин также использовал понятие «орбис по силе объекта»: Солнце, Луна, ASC, MC — 1°30′; планеты — 1°; остальное — 0°30′.

6.8. Классические комбинации Эбертина (примеры)

КартинаЗначение (по «Combination of Stellar Influences»)
☉ = ☽/ASCличная встреча, значимые отношения
☽ = ♀/♃счастье, гармония, беременность
♂ = ♄/♅внезапное насилие, травма, «сила против препятствия»
♄ = ☉/☽одиночество, разделение, скорбь
ASC = ♂/♄принуждение, тяжёлый труд
MC = ☉/♄ответственность, одиночество в карьере
♅ = ♂/♇сверхусилие, катастрофическая мощь
♃ = ☽/♀материнство, эстетическое счастье

6.9. Sensitive Points (чувствительные точки) и Sums / Differences

Sum (сумма): (A + B) mod 360 — не мидпойнт, а «точка суммы» (используется в уранической астрологии как аналог арабских жребиев).

Difference (разность): (A − B) mod 360.

Обобщённая жребиевая формула:

Part = (A + B − C) mod 360

Например, Жребий Фортуны: Fortuna = (ASC + ☽ − ☉) mod 360 (дневная карта).

Связь с уравнением A + B = C + D: жребий — это решение D в A + B = C + D.

6.10. Итоговый алгоритм поиска планетарных картин

find_planetary_pictures(bodies, orb=1.0, dial=90):
    pictures = []
    // A/B = C
    for each pair (A,B):
        m = midpoint_direct(λ_A, λ_B)
        for C in bodies, C ∉ {A,B}:
            d = dial_separation(λ_C, m, dial)
            if d ≤ orb: pictures.append(("A/B=C", A,B,C, d))
    // A/B = C/D
    mids = precompute all midpoints (with body pair labels)
    sort mids by dial_position
    // sweep-line для O(M log M) вместо O(M²)
    for each adjacent group within orb on the dial:
        emit all combinations (disjoint pairs only)
    return pictures

Оптимизация: при 16 телах — 120 мидпойнтов; наивный поиск A/B=C/D даёт 120² = 14400 сравнений. Sweep-line по отсортированным позициям на диске сокращает до линейного.


7. ВЕС И ОЦЕНКА АСПЕКТОВ (SCORING)

7.1. Линейная деградация (наиболее распространённая)

strength(delta, orb_max) = 1 − delta / orb_max        // 1 в точке, 0 на краю

Реализация с отсечением:

s = max(0, 1 − delta/orb_max)

7.2. Косинусная деградация (плавная, «мягкий край»)

strength = cos( (π/2) · delta / orb_max )

При delta = 0 → 1.0; при delta = orb_max → 0.0; производная на краю равна нулю (мягкое затухание).

Альтернатива — «приподнятый косинус» (raised cosine / Hann):

strength = 0.5 · ( 1 + cos( π · delta / orb_max ) )

При delta=0 → 1.0; delta=orb_max/2 → 0.5; delta=orb_max → 0.0. Производная нулевая на обоих концах — самая гладкая.

7.3. Гауссова деградация

strength = exp( − delta² / (2σ²) )

где σ = orb_max / 2.5 (тогда на краю орбиса сила ≈ 0.044) или σ = orb_max / 3 (≈ 0.011).

Формально не обращается в ноль, поэтому обычно отсекают: if delta > orb_max: strength = 0.

7.4. Степенная деградация (регулируемая «жёсткость»)

strength = ( 1 − delta/orb_max ) ^ p
pПоведение
0.5«плоская» — далёкие аспекты почти так же сильны
1.0линейная
2.0квадратичная — резкое падение
3.0очень концентрированная на точных

7.5. Синусоидальная («орбис-волна», гармоническая)

strength = cos( n · (d − A) )       // где d — фактическое расстояние

или нормированно для аспекта n-й гармоники:

strength = ( 1 + cos( n · (d − A) · π/180 ) ) / 2

Даёт плавную периодическую функцию без явного орбиса вообще — сила плавно колеблется по всему кругу. Это подход Эдди/Хэмблина.

7.6. Итоговый вес аспекта в софте

Типичная составная формула:

weight(P₁, P₂, A, delta) =
      aspect_base_weight[A]
    × planet_weight[P₁]
    × planet_weight[P₂]
    × orb_decay(delta, orb_limit)
    × applying_bonus
    × sign_agreement_bonus

Таблица 7.6.1 — Базовые веса аспектов

АспектВесПолярность
Соединение1.00нейтральная (зависит от планет)
Оппозиция0.90−1
Квадратура0.85−1
Тригон0.80+1
Секстиль0.55+1
Квиконс0.35−0.5
Полутораквадрат0.30−0.5
Полуквадрат0.30−0.5
Полусекстиль0.20+0.3
Квинтиль0.20+0.5
Биквинтиль0.15+0.5
Дециль/Тредециль0.10+0.3
Септильные0.10нейтральная
Новильные0.10+0.3
11-я, 13-я гармоника0.05нейтральная
Параллель0.70как соединение
Контрпараллель0.60как оппозиция

Таблица 7.6.2 — Веса планет

ОбъектВес
☉ Солнце1.00
☽ Луна1.00
ASC0.95
MC0.90
☿ Меркурий0.80
♀ Венера0.80
♂ Марс0.85
♃ Юпитер0.80
♄ Сатурн0.85
♅ Уран0.65
♆ Нептун0.60
♇ Плутон0.65
☊ Сев. узел0.50
⚷ Хирон0.40
Лилит0.30
Астероиды0.20

Бонусы/штрафы

applying_bonus    = 1.15 if APPLYING else 1.00     // классически аппликация сильнее
                    (некоторые школы: 1.0 vs 0.85)
partile_bonus     = 1.25 if delta < 1.0 else 1.00
dissociate_penalty= 0.75 if out_of_sign else 1.00
retrograde_factor = 0.90 if any planet retrograde else 1.00
angular_bonus     = 1.20 if planet in angular house (1,4,7,10)
                    1.00 if succedent, 0.85 if cadent

7.7. Агрегированные метрики карты

Общая аспектная напряжённость:

tension = Σ weight(aspect) для аспектов с полярностью < 0
harmony = Σ weight(aspect) для аспектов с полярностью > 0
balance = (harmony − tension) / (harmony + tension)     // −1..+1

Сила планеты по аспектам (aspect score):

score(P) = Σ_{все аспекты с участием P} weight(P, Q, A, delta) × polarity(A)

Индекс «загруженности» (aspect density):

density = (число найденных аспектов) / (C(N,2))

7.8. Пример численного расчёта

Солнце 12°14′ Овна (= 12.233°), Сатурн 15°08′ Рака (= 105.133°).

d = separation(12.233, 105.133) = 92.900°
A = 90 (квадратура)
delta = 2.900°
orb_limit (табл. 3.3.1, максимум) = max(orb[Sun][square]=8, orb[Saturn][square]=7) = 8°

Сила по разным функциям:

ФункцияЗначение
Линейная: 1 − 2.9/80.6375
Косинусная: cos(π/2 · 2.9/8)0.8383
Raised cosine: 0.5(1+cos(π·2.9/8))0.7203
Гаусс (σ=8/2.5=3.2): exp(−2.9²/(2·3.2²))0.6653
Квадратичная: (1−2.9/8)²0.4064

Итоговый вес (линейная, аппликация, в знаке):

weight = 0.85 (квадратура) × 1.00 (Солнце) × 0.85 (Сатурн) × 0.6375 × 1.15 (аппликация)
       = 0.5297

8. СКЛОНЕНИЕ (DECLINATION)

8.1. Формула склонения из эклиптических координат

Преобразование эклиптических (λ, β) в экваториальные (α, δ):

sin δ = sin β · cos ε + cos β · sin ε · sin λ

откуда:

δ = asin( sin β · cos ε + cos β · sin ε · sin λ )

Прямое восхождение:

α = atan2( sin λ · cos ε − tan β · sin ε ,  cos λ )

(результат нормализовать в 0…360).

Наклон эклиптики ε (obliquity of the ecliptic):

Средний наклон (формула IAU 1980 / Laskar, достаточно точна для ±1000 лет):

T = (JD − 2451545.0) / 36525            // юлианские столетия от J2000.0
ε₀ = 23°26′21.448″
   − 46.8150″·T
   − 0.00059″·T²
   + 0.001813″·T³

В градусах:

ε₀ = 23.439291111
   − 0.0130041667·T
   − 1.63888e-7·T²
   + 5.03611e-7·T³

Значения:

Эпохаε₀
J2000.0 (2000-01-01)23°26′21.4″ = 23.43929°
1950.023°26′44.8″ = 23.44578°
2000.023.43929°
2026.0≈ 23°26′11″ = 23.43639°
2050.0≈ 23°26′02″ = 23.43389°

Для истинного наклона добавляется нутация по наклону Δε (до ±9.2″) — для астрологии несущественно.

8.2. Упрощённая формула (при нулевой широте, β = 0)

Для Солнца (β ≈ 0 всегда) и как приближение для планет:

δ = asin( sin ε · sin λ )

Таблица склонения Солнца по долготе (ε = 23.4363°, 2026):

λ (°)Знак/градусδ
00° Овна0°00′
1515° Овна+5°59′
300° Тельца+11°28′
4515° Тельца+16°17′
600° Близнецов+20°09′
7515° Близнецов+22°42′
900° Рака+23°26′ (максимум)
10515° Рака+22°42′
1200° Льва+20°09′
13515° Льва+16°17′
1500° Девы+11°28′
16515° Девы+5°59′
1800° Весов0°00′
2100° Скорпиона−11°28′
2400° Стрельца−20°09′
2700° Козерога−23°26′ (минимум)
3000° Водолея−20°09′
3300° Рыб−11°28′

8.3. Out-of-bounds (OOB, «за пределами границ»)

Планета out-of-bounds, если её склонение превышает максимальное склонение Солнца:

is_out_of_bounds(δ, ε):
    return |δ| > ε                     // ε ≈ 23°26′ ≈ 23.4367°

Порог зависит от эпохи (см. таблицу ε выше). Многие программы используют фиксированное 23°26′ = 23.43333° или 23°27′ = 23.45°.

Какие тела бывают OOB: | Тело | Макс. |δ| | Бывает OOB? | |---|---|---| | ☉ Солнце | 23°26′ | никогда (по определению) | | ☽ Луна | до 28°43′ | да, циклично (период 18.6 года — нутация узлов) | | ☿ Меркурий | до ~26° | да, часто | | ♀ Венера | до ~28° | да | | ♂ Марс | до ~27° | да | | ♃ Юпитер | до ~24° | редко | | ♄ Сатурн | до ~24° | редко | | ♅ Уран | до ~24° | очень редко | | ♆ Нептун | до ~23° | практически нет | | ♇ Плутон | до ~45° | да, часто (большая широта) |

Лунный цикл OOB: Луна максимально OOB, когда её узлы совпадают с равноденствиями и наклонение (5°09′) складывается с ε: 23°26′ + 5°09′ = 28°35′ (major lunar standstill, «большое лунное стояние»). Минимум: 23°26′ − 5°09′ = 18°17′ (minor standstill) — тогда Луна OOB не бывает вовсе.

| Период | Тип стояния | Макс. |δ| Луны | |---|---|---| | 2006 | Major | 28°43′ | | 2015 | Minor | 18°08′ | | 2025 | Major | 28°43′ | | 2034 | Minor | 18°08′ |

Интерпретация OOB (Kt Boehrer, Steven Forrest): «вне закона», за рамками нормы, экстремальность, гениальность/девиантность, отсутствие социальных ограничений.

8.4. Детекция параллелей и контрпараллелей — полный алгоритм

detect_declination_aspects(bodies, orb=1.0):
    results = []
    for each pair (A, B):
        δA = declination(A); δB = declination(B)
        orb_par   = abs(δA − δB)
        orb_contra= abs(δA + δB)
        if orb_par ≤ orb and sign(δA) == sign(δB):
            results.append(Parallel(A, B, orb_par))
        if orb_contra ≤ orb and sign(δA) != sign(δB):
            results.append(Contraparallel(A, B, orb_contra))
    return results

Граничный случай: если одно из склонений близко к нулю (|δ| < orb), то и параллель, и контрпараллель могут формально пройти. Корректная обработка — использовать только |δA − δB| ≤ orb для параллели и |δA + δB| ≤ orb для контрпараллели, не проверяя знаки:

is_parallel       = |δA − δB| ≤ orb
is_contraparallel = |δA + δB| ≤ orb
// при δA ≈ δB ≈ 0 оба истинны — это корректно, обе интерпретации применимы

Аппликация/сепарация по склонению: через производную склонения dδ/dt:

dδ/dt ≈ ( δ(t+h) − δ(t−h) ) / (2h)
// затем тот же метод, что в §1.5 метод 1

8.5. Деклинационные аспекты за пределами параллели

Некоторые школы (Charles Jayne, Leigh Westin) используют деклинационные градусные аспекты (declination aspects / «contra-declinations»):

// Аналог квадратуры в склонении: разница склонений ≈ ε/2 ≈ 11°43'
// Аналог других аспектов вычисляется через долготу точек равного склонения

Более распространён подход через antiscia (§2.11) — они математически связаны: точки с равным склонением по долготе и есть антисы.

Ключевое тождество (при β=0):

δ( antiscion(λ) ) = δ(λ)

Проверка: sin δ = sin ε · sin λ; antiscion(λ) = 180 − λ; sin(180 − λ) = sin λ. Следовательно склонения равны. ✓

δ( contra_antiscion(λ) ) = −δ(λ)

Проверка: contra_antiscion(λ) = 360 − λ = −λ; sin(−λ) = −sin λ. ✓

То есть антис = параллель по долготе, контрантис = контрпараллель по долготе — для тел с нулевой широтой. Для тел с ненулевой широтой они расходятся, и это важное различие: антисы — долготная симметрия, параллели — реальное склонение.

8.6. Восхождение по прямой и «мунданные» аспекты

Right ascension (прямое восхождение, α) — аналог долготы на экваторе. Аспекты в RA («aspects in right ascension») используются в примарных дирекциях.

α = atan2( sin λ · cos ε − tan β · sin ε,  cos λ ) mod 360
separation_RA = separation(α₁, α₂)

Aspects in mundo (мунданные аспекты) — по домам, а не по эклиптике. Расстояние измеряется в «домных градусах»:

house_position(λ) = house_number + fraction_within_house    // непрерывная величина 1.0..13.0
mundane_separation = |hp₁ − hp₂| × 30                       // в «домных градусах»

ПРИЛОЖЕНИЕ A. СВОДНАЯ РЕАЛИЗАЦИЯ (псевдокод)

import math
from itertools import combinations

# ---------- базовые утилиты ----------
def norm360(x): return x % 360.0

def separation(a, b):
    d = (b - a) % 360.0
    return 360.0 - d if d > 180.0 else d

def signed_diff(a, b):
    return (b - a + 180.0) % 360.0 - 180.0

# ---------- каталог аспектов ----------
ASPECTS = [
    ("Conjunction",    0.0,            1,  "major"),
    ("Opposition",     180.0,          2,  "major"),
    ("Trine",          120.0,          3,  "major"),
    ("Square",         90.0,           4,  "major"),
    ("Sextile",        60.0,           6,  "major"),
    ("Semisextile",    30.0,           12, "minor"),
    ("Semisquare",     45.0,           8,  "minor"),
    ("Sesquiquadrate", 135.0,          8,  "minor"),
    ("Quincunx",       150.0,          12, "minor"),
    ("Decile",         36.0,           10, "quintile"),
    ("Quintile",       72.0,           5,  "quintile"),
    ("Tredecile",      108.0,          10, "quintile"),
    ("Biquintile",     144.0,          5,  "quintile"),
    ("Septile",        360/7,          7,  "septile"),
    ("Biseptile",      720/7,          7,  "septile"),
    ("Triseptile",     1080/7,         7,  "septile"),
    ("Novile",         40.0,           9,  "novile"),
    ("Binovile",       80.0,           9,  "novile"),
    ("Quadnovile",     160.0,          9,  "novile"),
    ("Undecile",       360/11,         11, "exotic"),
    ("Quindecile",     165.0,          24, "special"),
]

# ---------- орбисы ----------
ORB_TABLE = {            # planet -> {aspect_class: orb}
    "Sun":     {"major": 10, "minor": 3, "quintile": 2, "septile": 1, "novile": 1, "exotic": 0.5, "special": 2},
    "Moon":    {"major": 10, "minor": 3, "quintile": 2, "septile": 1, "novile": 1, "exotic": 0.5, "special": 2},
    "Mercury": {"major": 7,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "Venus":   {"major": 7,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "Mars":    {"major": 8,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "Jupiter": {"major": 9,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "Saturn":  {"major": 9,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "Uranus":  {"major": 6,  "minor": 1.5, "quintile": 1, "septile": 0.5, "novile": 0.5, "exotic": 0.5, "special": 1},
    "Neptune": {"major": 6,  "minor": 1.5, "quintile": 1, "septile": 0.5, "novile": 0.5, "exotic": 0.5, "special": 1},
    "Pluto":   {"major": 6,  "minor": 1.5, "quintile": 1, "septile": 0.5, "novile": 0.5, "exotic": 0.5, "special": 1},
    "ASC":     {"major": 8,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
    "MC":      {"major": 8,  "minor": 2, "quintile": 1.5, "septile": 1, "novile": 1, "exotic": 0.5, "special": 1.5},
}

# традиционные мойети (Lilly, по опыту)
LILLY_MOIETY = {"Sun":8.5, "Moon":6.25, "Mercury":3.5, "Venus":4.0,
                "Mars":3.75, "Jupiter":6.0, "Saturn":5.0}
ANCIENT_MOIETY = {"Sun":7.5, "Moon":6.0, "Mercury":3.5, "Venus":3.5,
                  "Mars":4.0, "Jupiter":4.5, "Saturn":4.5}

def orb_limit_modern(p1, p2, aspect_class):
    return max(ORB_TABLE[p1][aspect_class], ORB_TABLE[p2][aspect_class])

def orb_limit_traditional(p1, p2, table=LILLY_MOIETY):
    return table[p1] + table[p2]

# ---------- поиск аспектов ----------
def find_aspects(bodies, mode="modern"):
    """bodies: list of dicts {id, lon, speed}"""
    out = []
    for A, B in combinations(bodies, 2):
        d = separation(A["lon"], B["lon"])
        for name, angle, harmonic, cls in ASPECTS:
            if mode == "modern":
                limit = orb_limit_modern(A["id"], B["id"], cls)
            else:
                if cls != "major": continue          # традиция: только птолемеевы
                limit = orb_limit_traditional(A["id"], B["id"])
            delta = abs(d - angle)
            if delta <= limit:
                out.append({
                    "a": A["id"], "b": B["id"], "aspect": name,
                    "angle": angle, "orb": delta, "limit": limit,
                    "exactness": 1 - delta/limit,
                    "phase": applying(A, B, angle),
                    "partile": delta < 1.0,
                    "harmonic": harmonic,
                })
                break     # один аспект на пару
    return out

def applying(A, B, angle, h=0.01):
    d0 = abs(separation(A["lon"], B["lon"]) - angle)
    d1 = abs(separation(A["lon"] + A["speed"]*h,
                        B["lon"] + B["speed"]*h) - angle)
    if d1 < d0 - 1e-12: return "applying"
    if d1 > d0 + 1e-12: return "separating"
    return "exact"

# ---------- деклинация ----------
def obliquity(jd):
    T = (jd - 2451545.0) / 36525.0
    return (23.439291111 - 0.0130041667*T
            - 1.63888e-7*T*T + 5.03611e-7*T**3)

def declination(lon, lat, eps):
    L, B, E = map(math.radians, (lon, lat, eps))
    return math.degrees(math.asin(
        math.sin(B)*math.cos(E) + math.cos(B)*math.sin(E)*math.sin(L)))

def is_oob(dec, eps): return abs(dec) > eps

# ---------- антисы ----------
def antiscion(lon):        return (180.0 - lon) % 360.0
def contra_antiscion(lon): return (360.0 - lon) % 360.0

# ---------- мидпойнты ----------
def midpoint(a, b):
    d = signed_diff(a, b)
    return (a + d/2.0) % 360.0

def dial(lon, size=90.0): return lon % size

def dial_sep(a, b, size=90.0):
    d = (a - b) % size
    return size - d if d > size/2 else d

# ---------- гармоники ----------
def harmonic(lon, n): return (lon * n) % 360.0

ПРИЛОЖЕНИЕ B. КОНТРОЛЬНЫЕ ЗНАЧЕНИЯ ДЛЯ ТЕСТОВ

ВходФункцияОжидаемый результат
separation(350, 10)20.0
separation(10, 350)20.0
separation(0, 180)180.0
separation(0, 181)179.0
signed_diff(350, 10)+20.0
signed_diff(10, 350)−20.0
midpoint(350, 10)0.0
midpoint(10, 350)0.0
midpoint(0, 180)90.0 (неоднозначно, но direct = 90)
midpoint(100, 200)150.0
midpoint(350, 100)45.0
antiscion(45)15° Тельца135.0 = 15° Льва
antiscion(90)0° Рака90.0 (неподвижна)
antiscion(270)0° Козерога270.0 (неподвижна)
contra_antiscion(45)315.0 = 15° Водолея
contra_antiscion(0)0.0 (неподвижна)
harmonic(233.55, 5)87.75
harmonic(72, 5)0.0
harmonic(51.4285714, 7)≈0.0
dial(275, 90)5.0
dial_sep(5, 89, 90)6.0
declination(90, 0, 23.4393)0° Рака+23.4393
declination(0, 0, 23.4393)0.0
declination(270, 0, 23.4393)−23.4393
orb_limit_traditional("Sun","Moon", LILLY)14.75
orb_limit_traditional("Saturn","Mars", LILLY)8.75

ПРИЛОЖЕНИЕ C. ГЛОССАРИЙ РУС/АНГЛ

РусскийEnglish
АспектAspect
ОрбисOrb
Мойети (половина орбиса)Moiety
АппликацияApplying
СепарацияSeparating
ПартильныйPartile
ПлатическийPlatic
СоединениеConjunction
ОппозицияOpposition
Тригон / ТринTrine
КвадратураSquare
СекстильSextile
ПолусекстильSemisextile
ПолуквадратSemisquare / Octile
ПолутораквадратSesquiquadrate / Trioctile
Квиконс / ИнконъюнкцияQuincunx / Inconjunct
КвинтильQuintile
БиквинтильBiquintile
СептильSeptile
НовильNovile
ПараллельParallel
КонтрпараллельContraparallel
СклонениеDeclination
За пределами границOut-of-bounds (OOB)
АнтисAntiscion
КонтрантисContra-antiscion
Мидпойнт / ПолусуммаMidpoint / Half-sum
Планетарная картинаPlanetary picture
Большой тринGrand Trine
Т-квадратT-Square
Большой крестGrand Cross
Йод / Палец БогаYod / Finger of God
Мистический прямоугольникMystic Rectangle
Воздушный змейKite
Большой секстильGrand Sextile
СтеллиумStellium
КолыбельCradle
Молот ТораThor's Hammer
БумерангBoomerang
ГармоникаHarmonic
90-градусный диск90° Dial
Наклон эклиптикиObliquity of the ecliptic
Диссоциированный аспектDissociate / out-of-sign aspect
Правый / левый аспектDexter / Sinister
РефранацияRefranation
Перенос светаTranslation of light
Собирание светаCollection of light
ЗапрещениеProhibition

КРИТИЧЕСКИЕ ЗАМЕЧАНИЯ ПО РЕАЛИЗАЦИИ

  1. Всегда используйте norm360 вместо % в языках с отрицательным остатком (C, C++, Java, JS, Go).
  2. Мидпойнт нельзя считать как (a+b)/2 — обязательна обработка wraparound.
  3. Скорость планет должна быть знаковой — ретроградность критична для аппликации/сепарации.
  4. Орбис аспекта и фактический орб — разные величины, не смешивайте в API.
  5. Для йодов и молотов Тора допуск обязан быть ≤3°, иначе ложные срабатывания в каждой карте.
  6. Гармонические карты: орбис делить на n.
  7. Соединение — не «аспект 0°» в смысле деления круга; это гармоника 1 и вырожденный случай. Некоторые движки ошибочно применяют к нему логику «0 mod 360 = 360».
  8. Отсутствующий аспект ≠ отсутствие связи — в традиции существует аверсия (30°, 150°) как значимое состояние.
  9. При поиске фигур сначала кластеризуйте соединения, иначе стеллиум из 3 планет даст 3 «одинаковых» больших трина.
  10. Проверяйте все перестановки участников при детекции несимметричных фигур (T-квадрат, йод) — иначе апекс определится неверно.

Sources


Примечание к отчёту для вызывающего агента: документ содержит ~1050 строк, покрывает все 8 запрошенных разделов. Главные подтверждённые из первоисточников факты: (а) таблица Лилли с двумя колонками (10/12/7.5/17/8/7/12.5 «по опыту» против 9/9/7/15/7/7/12 «древних») и его мойети (☉8.5, ☽6.25, ☿3.5, ♀4.0, ♂3.75, ♃6.0, ♄5.0); (б) орбисы аль-Бируни совпадают с общеарабской линией (☉15, ☽12, ♄/♃9, ♂8, ♀/☿7 «вперёд и назад»); (в) важное терминологическое различие — Порфирий даёт суммарный «периметр» (30/24/18/16/14), остальные авторы дают радиус; (г) числовые таблицы орбисов Astrotheme для натала/синастрии/транзитов с поправками на светила; (д) формулы антисов (180−λ) и контрантисов (360−λ) и их точная связь со склонением. Файлы не создавались.