diff --git a/scripts/varga.py b/scripts/varga.py index 5c0813b6..3a26990a 100644 --- a/scripts/varga.py +++ b/scripts/varga.py @@ -3,7 +3,7 @@ """ 吠陀占星分盘计算模块 v1.0 BPHS Shodasavarga(十六分盘体系) -支持: D2/D3/D4/D5/D6/D7/D8/D9/D10/D11/D12/D16/D20/D24/D27/D30/D40/D45/D60/D144 +支持: D2/D3/D4/D5/D6/D7/D8/D9/D10/D11/D12/D16/D20/D24/D27/D30/D40/D45/D60/D81/D108/D144 每个分盘输出精确度数,支持进一步分析。 """ from typing import Dict, List, Optional @@ -31,6 +31,8 @@ VARGA_META = { 27:{'name':'Bhamsa','cn':'力量','area':'力量弱点'},30:{'name':'Trimsamsa','cn':'苦难','area':'灾难苦难'}, 40:{'name':'Khavedamsa','cn':'运势','area':'吉凶运势'},45:{'name':'Akshavedamsa','cn':'格局','area':'整体格局'}, 60:{'name':'Shashtyamsa','cn':'业力','area':'前世业力同盘区分'}, + 81:{'name':'Navamsa-Navamsa','cn':'D9之D9','area':'配偶灵性精微层'}, + 108:{'name':'Dwadasamsa-Navamsa','cn':'D12之D9','area':'祖先父母精微层'}, 144:{'name':'Dwadasamsa-Dwadasamsa','cn':'D12之D12','area':'父母祖先精微层'}} def _si(lon): return int(lon/30)%12 @@ -87,6 +89,16 @@ def varga_map(si, pi, div): if div==40: return ((0 if o else 6)+pi)%12 if div==45: return ((0 if o else 6)+pi)%12 if div==60: return (si+pi)%12 if o else (si+1+pi)%12 + if div==81: + outer_part = pi // 9 + inner_part = pi % 9 + outer_sign = varga_map(si, outer_part, 9) + return varga_map(outer_sign, inner_part, 9) + if div==108: + outer_part = pi // 12 + inner_part = pi % 12 + outer_sign = varga_map(si, outer_part, 9) + return varga_map(outer_sign, inner_part, 12) if div==144: outer_part = pi // 12 inner_part = pi % 12 @@ -255,7 +267,7 @@ def dignity(planet, sign_idx): def calc_all_vargas(planet_lons, asc_lon, divisions=None, mode='classical_local'): """批量计算所有指定分盘""" if divisions is None: - divisions=[2,3,4,5,6,7,8,9,10,11,12,16,20,24,27,30,40,45,60,144] + divisions=[2,3,4,5,6,7,8,9,10,11,12,16,20,24,27,30,40,45,60,81,108,144] results={} for div in divisions: m=VARGA_META.get(div,{}) diff --git a/tests/test_varga_bphs.py b/tests/test_varga_bphs.py index efd5a7d0..95443b1f 100644 --- a/tests/test_varga_bphs.py +++ b/tests/test_varga_bphs.py @@ -107,7 +107,7 @@ def test_rudramsa_d11_is_supported_by_native_varga_map() -> None: def test_native_varga_map_supports_declared_high_value_vargas() -> None: - for div in (2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 60, 144): + for div in (2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 24, 60, 81, 108, 144): result = calc_varga(35.0, div) assert result["sign"] in SIGNS assert 0 <= result["degree_in_sign"] < 30 @@ -115,7 +115,7 @@ def test_native_varga_map_supports_declared_high_value_vargas() -> None: def test_default_varga_batch_includes_declared_vargas() -> None: charts = calc_all_vargas({"Moon": 35.0}, 10.0) - for key in ("D5_Panchamsa", "D6_Shashthamsa", "D8_Ashtamsa", "D11_Rudramsa", "D144_Dwadasamsa-Dwadasamsa"): + for key in ("D5_Panchamsa", "D6_Shashthamsa", "D8_Ashtamsa", "D11_Rudramsa", "D81_Navamsa-Navamsa", "D108_Dwadasamsa-Navamsa", "D144_Dwadasamsa-Dwadasamsa"): assert key in charts assert charts["D11_Rudramsa"]["Moon"]["sign"] == "Aquarius"