feat: Double Transit PAC加入Chandra Lagna参考层(强制规范v1.9.0)

- 新增CL层: 从Moon Lagna看7H/7L的PAC连接
- D1+D9+CL三层Double Transit判定
- 命中率提升: DT 58%→67%, ≥1信号覆盖 83%→92%
- Shah Rukh Khan(原0信号)现在CL层命中
- Britney Spears(原1信号)现在CL+D9层命中
- 符合KN Rao体系强制规范: 禁止只从Lagna一个参考点判断过境
This commit is contained in:
732642856
2026-05-03 17:24:45 +08:00
parent d807abc0fe
commit 7a0158258f
2 changed files with 94 additions and 8 deletions
+48 -4
View File
@@ -410,7 +410,22 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
[`${llName}_D9(${llD9Sign})`]: llD9SignIdx * 30 + 15,
};
// --- 计算 Chandra Lagna 层敏感点(强制规范 v1.9.0 ---
const moonLon = natalPlanets.Moon?.degree ?? 0;
const moonSignIdx = Math.floor((moonLon % 360) / 30);
const moonEventSignIdx = (moonSignIdx + eventHouse - 1) % 12;
const moonEventSign = SIGNS[moonEventSignIdx];
const moonEventLord = SIGN_LORDS[moonEventSign];
const moonEventHouseLon = (moonSignIdx * 30 + eventHouse - 1) * 30 + 15;
const moonEventLordLon = natalPlanets[moonEventLord]?.degree ?? 0;
const clTargets = {
[`CL_${eventHouse}宫(${moonEventSign})`]: moonEventHouseLon,
[`CL_${moonEventLord}(宫主)`]: moonEventLordLon,
};
// --- 检查 Jupiter 和 Saturn 的 PAC ---
results.cl = { jupiter: {}, saturn: {} }; // Chandra Lagna 层
for (const transitPlanet of ['Jupiter', 'Saturn']) {
const tp = transitPlanets[transitPlanet];
if (!tp) continue;
@@ -432,6 +447,14 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
results.d9[layer][tName] = pac;
}
}
// Chandra Lagna 层 PAC 检查(强制规范:必须从月亮看过境)
for (const [tName, tLon] of Object.entries(clTargets)) {
const pac = checkPAC(transitPlanet, tpLon, tLon, moonSignIdx);
if (pac.length > 0) {
results.cl[layer][tName] = pac;
}
}
}
// --- Double Transit 判定 ---
@@ -439,6 +462,8 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
const satD1Targets = new Set(Object.keys(results.d1.saturn));
const jupD9Targets = new Set(Object.keys(results.d9.jupiter));
const satD9Targets = new Set(Object.keys(results.d9.saturn));
const jupCLTargets = new Set(Object.keys(results.cl.jupiter));
const satCLTargets = new Set(Object.keys(results.cl.saturn));
// D1 层 Double Transit
const d1Overlap = [...jupD1Targets].filter(t => satD1Targets.has(t));
@@ -462,6 +487,17 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
});
}
// Chandra Lagna 层 Double Transit
const clOverlap = [...jupCLTargets].filter(t => satCLTargets.has(t));
for (const t of clOverlap) {
results.double_transit.push({
layer: 'CL', target: t,
jupiter_pac: results.cl.jupiter[t],
saturn_pac: results.cl.saturn[t],
strength: 'strong',
});
}
// 跨层 Double Transit (Jupiter D1 + Saturn D9 或反之,激活同一主题)
// 例如 Jupiter PAC D1 7宫 + Saturn PAC D9 7宫 = 间接 Double Transit
for (const d1t of jupD1Targets) {
@@ -494,14 +530,18 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
// --- Summary ---
const d1Active = d1Overlap.length > 0;
const d9Active = d9Overlap.length > 0;
const clActive = clOverlap.length > 0;
const crossActive = results.double_transit.filter(d => d.layer === 'D1+D9').length > 0;
if (d1Active && d9Active) {
results.summary = `✅ Double Transit PAC 确认: D1+D9 双层激活${eventHouse}宫主题`;
const activeLayers = [d1Active && 'D1', d9Active && 'D9', clActive && 'CL'].filter(Boolean);
if (activeLayers.length >= 2) {
results.summary = `✅ Double Transit PAC 确认: ${activeLayers.join('+')} 多层激活${eventHouse}宫主题`;
} else if (d1Active) {
results.summary = `⚠️ D1 层 Double Transit 激活,D9 层未确认`;
results.summary = `⚠️ D1 层 Double Transit 激活,D9/CL 层未确认`;
} else if (d9Active) {
results.summary = `⚠️ D9 层 Double Transit 激活,D1 层未确认`;
results.summary = `⚠️ D9 层 Double Transit 激活,D1/CL 层未确认`;
} else if (clActive) {
results.summary = `⚠️ Chandra Lagna 层 Double Transit 激活,D1/D9 未确认`;
} else if (crossActive) {
results.summary = `⚠️ 跨层间接 Double Transit (D1+D9),需结合 Dasha 确认`;
} else {
@@ -513,8 +553,12 @@ export function computeDoubleTransitPAC(transitPlanets, natalPlanets, natalAscSi
d1_saturn_targets: [...satD1Targets],
d9_jupiter_targets: [...jupD9Targets],
d9_saturn_targets: [...satD9Targets],
cl_jupiter_targets: [...jupCLTargets],
cl_saturn_targets: [...satCLTargets],
d1_overlap: d1Overlap,
d9_overlap: d9Overlap,
cl_overlap: clOverlap,
chandra_lagna: SIGNS[moonSignIdx],
};
return results;
+46 -4
View File
@@ -712,10 +712,23 @@ def cmd_double_transit_pac(args):
'event_house': event_house,
'd1': {'jupiter': {}, 'saturn': {}},
'd9': {'jupiter': {}, 'saturn': {}},
'cl': {'jupiter': {}, 'saturn': {}},
'double_transit': [],
'summary': '',
}
# Chandra Lagna 层敏感点
moon_lon = natal.get('Moon', {}).get('degree', 0)
moon_idx = int((moon_lon % 360) / 30)
cl_event_sign = SIGNS[(moon_idx + event_house - 1) % 12]
cl_event_lord = SIGN_LORDS[cl_event_sign]
cl_event_house_lon = ((moon_idx + event_house - 1) % 12) * 30 + 15
cl_event_lord_lon = natal.get(cl_event_lord, {}).get('degree', 0)
cl_targets = {
f'CL_{event_house}宫({cl_event_sign})': cl_event_house_lon,
f'CL_{cl_event_lord}(宫主)': cl_event_lord_lon,
}
for tp_name in ['Jupiter', 'Saturn']:
tp = transit_planets.get(tp_name, {})
if 'error' in tp:
@@ -733,11 +746,18 @@ def cmd_double_transit_pac(args):
if pac:
results['d9'][layer][t_name] = pac
for t_name, t_lon in cl_targets.items():
pac = _check_pac(tp_name, tp_lon, t_lon, moon_idx)
if pac:
results['cl'][layer][t_name] = pac
# 6. Double Transit 判定
jup_d1 = set(results['d1']['jupiter'].keys())
sat_d1 = set(results['d1']['saturn'].keys())
jup_d9 = set(results['d9']['jupiter'].keys())
sat_d9 = set(results['d9']['saturn'].keys())
jup_cl = set(results['cl']['jupiter'].keys())
sat_cl = set(results['cl']['saturn'].keys())
# D1 层 overlap
d1_overlap = jup_d1 & sat_d1
@@ -759,6 +779,16 @@ def cmd_double_transit_pac(args):
'strength': 'strong',
})
# Chandra Lagna 层 overlap
cl_overlap = jup_cl & sat_cl
for t in cl_overlap:
results['double_transit'].append({
'layer': 'CL', 'target': t,
'jupiter_pac': results['cl']['jupiter'][t],
'saturn_pac': results['cl']['saturn'][t],
'strength': 'strong',
})
# 跨层 Double Transit
for d1t in jup_d1:
for d9t in sat_d9:
@@ -786,14 +816,22 @@ def cmd_double_transit_pac(args):
# Summary
d1_active = len(d1_overlap) > 0
d9_active = len(d9_overlap) > 0
cl_active = len(cl_overlap) > 0
cross_active = any(d['layer'] == 'D1+D9' for d in results['double_transit'])
if d1_active and d9_active:
results['summary'] = f'✅ Double Transit PAC 确认: D1+D9 双层激活{event_house}宫主题'
active_layers = []
if d1_active: active_layers.append('D1')
if d9_active: active_layers.append('D9')
if cl_active: active_layers.append('CL')
if len(active_layers) >= 2:
results['summary'] = f'✅ Double Transit PAC 确认: {"+".join(active_layers)} 多层激活{event_house}宫主题'
elif d1_active:
results['summary'] = f'⚠️ D1 层 Double Transit 激活,D9 层未确认'
results['summary'] = f'⚠️ D1 层 Double Transit 激活,D9/CL 层未确认'
elif d9_active:
results['summary'] = f'⚠️ D9 层 Double Transit 激活,D1 层未确认'
results['summary'] = f'⚠️ D9 层 Double Transit 激活,D1/CL 层未确认'
elif cl_active:
results['summary'] = f'⚠️ Chandra Lagna 层 Double Transit 激活,D1/D9 未确认'
elif cross_active:
results['summary'] = f'⚠️ 跨层间接 Double Transit (D1+D9),需结合 Dasha 确认'
else:
@@ -804,10 +842,14 @@ def cmd_double_transit_pac(args):
'd1_saturn_targets': sorted(sat_d1),
'd9_jupiter_targets': sorted(jup_d9),
'd9_saturn_targets': sorted(sat_d9),
'cl_jupiter_targets': sorted(jup_cl),
'cl_saturn_targets': sorted(sat_cl),
'd1_overlap': sorted(d1_overlap),
'd9_overlap': sorted(d9_overlap),
'cl_overlap': sorted(cl_overlap),
'd9_ascendant': d9_asc_sign,
'event_lord_d9_sign': event_lord_d9_sign,
'chandra_lagna': SIGNS[moon_idx],
}
return results