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:
+48
-4
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user